본문 바로가기

Algorithm/Dynamic Programming

(32)
[Python] 백준 14501번 : 퇴사 (S4) #문제 www.acmicpc.net/problem/14501 14501번: 퇴사 첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다. www.acmicpc.net #풀이 & 학습한 내용 시작과 종료일이 있고, 각각의 수익이 다른 상담들 중에서 총 수익을 최대화하는 문제입니다. 종료일 기준으로 오름차순 정렬한 후에, dp[k]를 "k일까지의 최대이익"으로 정의하여 dp리스트를 앞에서부터 채워나갑니다. 그리고 dp[N]이 N일까지의 최대이익이므로 정답으로 출력합니다. #소스코드 N=int(input()) consults=[] #상담들 저장하는 리스트 dp=[0]*(N+1) #★dp[k]: k일까지의 최대이익 for i in range(N): one_consult=[i+1]+list(map(int,inpu..
[C++] 백준 2133번 : 타일 채우기 (S2) #문제 www.acmicpc.net/problem/2133 2133번: 타일 채우기 3×N 크기의 벽을 2×1, 1×2 크기의 타일로 채우는 경우의 수를 구해보자. www.acmicpc.net #풀이 & 학습한 내용 이번문제에서 가로길이가 0일때의 경우의 수를 1로 설정해줘야한다. 그리고 가로길이가 홀수일때는 총 타일수가 홀수 개가 되므로 항상 경우의 수가 0이다. 마지막에 어떤 타일로 끝날 수 있는지 분석해야하는 과정이 쉽지 않다. 점화식을 세우고 base케이스를 채운 뒤 for문을 통해 dp배열을 채워나가 답을 구했다. #소스코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include #include using namesp..
[C++] 백준 17404번 : RGB거리 2 (G4) #문제 www.acmicpc.net/problem/17404 17404번: RGB거리 2 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 www.acmicpc.net #풀이 & 학습한 내용 supremo7.tistory.com/99에서 풀었던 RGB거리 문제의 응용문제이다. 기존문제에서 추가된 점은 첫번째 집과 마지막 집의 색 또한 같아선 안된다는 점이다. 집들이 원으로 둘러져서 있다고 생각하면 편하다. 이때, 첫번째 집의 색을 하나로 결정한 후, 각각에 대해 dynamic programming을 통해 최솟값들을 구하면 된다. 첫번째 집의..
[C++] 백준 13398번 : 연속합 2 (G5) #문제 www.acmicpc.net/problem/13398 13398번: 연속합 2 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다. www.acmicpc.net #풀이 & 학습한 내용 supremo7.tistory.com/94에서 푼 연속합 문제의 응용문제이다. 하나의 수를 삭제할 수 있으므로 각각에 대해 최대연속합을 구하여 비교하면 되지만, 그럴경우 시간복잡도가 O(N^2)이 되므로 문제조건에 의해 불가능하다. 따라서 다른 방법을 생각해 볼 때, DL[i]는 i번째 수에서 끝나는 최대 연속합, DR[i]는 i번째 수에서 시작하는 최대 연속합이라 하면 DL[i - ..
[C++] 백준 11054번 : 가장 긴 바이토닉 부분 수열 (G3) #문제 www.acmicpc.net/problem/11054 11054번: 가장 긴 바이토닉 부분 수열 첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000) www.acmicpc.net #풀이 & 학습한 내용 가장 긴 증가/감소하는 부분 수열 문제를 응용한 문제이다. 먼저 S1 Sk+1 > ... SN-1 > SN에서 Sk에 for문을 통해 수열에 있는 모든 수를 넣어준다. 이때의 시간복잡도는 O(N). 그리고 Sk기준으로 수열의 앞부분에서는 Sk를 포함하는 가장 긴 증가하는 부분 수열을 구하고, 수열의 뒷부분에서는 Sk를 포함하는 가장 긴 감소하는 부분 수열을 구..
[C++] 백준 11055번 : 가장 큰 증가 부분 수열 (S2) #문제 www.acmicpc.net/problem/11055 11055번: 가장 큰 증가 부분 수열 수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수 www.acmicpc.net #풀이 & 학습한 내용 supremo7.tistory.com/92에서는 길이를 구했다면, 이 문제에서는 수의 합에 대해 살핀다. 따라서 맨 처음 그 수만 포함할때인 p[i]를 dp[i]에 저장하고, 그 앞의 수들에 대해 p[j] dp[i]를 통해 dp[i]를 갱신하며 결정한다. 그리고 dp배열의 값들 ..
[C++] 백준 11722번 : 가장 긴 감소하는 부분 수열 (S2) #문제 www.acmicpc.net/problem/11722 11722번: 가장 긴 감소하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 감소하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 30, 10, 20, 20, 10} 인 경우에 가장 긴 감소하는 부분 수열은 A = {10, 30, 10, 20, 20, 10} www.acmicpc.net #풀이 & 학습한 내용 supremo7.tistory.com/92에서 푼 문제에서 부호만 바뀐 문제이다. 맨 처음 그 수만 선택되었을 때인 1을 모두 넣어주고, 그 수 앞의 수들에 대해 p[j] > p[i] && dp[j] + 1 > dp[i]을 통해 dp[i]값을 결정한다. 그리고 dp배열 중 최댓값으로 답을 출력해준다. #소스..
[C++] 백준 1932번 : 정수 삼각형 (S1) #문제 www.acmicpc.net/problem/1932 1932번: 정수 삼각형 첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다. www.acmicpc.net #풀이 & 학습한 내용 삼각형 내부의 어떤 수 기준으로 볼때 윗열에서 오는 수는 왼쪽에서 연결되거나 오른쪽에서 연결된다. "삼각형 내부의 i행 j열 위치에서 그 위치까지 연결된 합 중 최대"를 dp[i][j]이라 할 때, dp[i][j] = max({ dp[i - 1][j - 1], dp[i - 1][j] }) +p[i][j]인 substructure를 얻을 수 있다. 이를 토대로 for문을 구성하여 dp배열을 n까지 채운다. 그리고 마지막에 dp배열의 n행에 있는 값들 중 ..