반응형
문제 출처 :
https://www.acmicpc.net/problem/11066
알고리즘 분석 :
문제 해결에 필요한 사항
1. Dynamic Programming
2. 점화식 세우는 방법
3중 포문을 이용하여 문제를 해결 할 수 있다.
점화식은 다음과 같다.
dp[j][i] :: j~i번째까지 파일을 합칠 때 최소비용
3중포문은 다음과 같이 이용한다.
for (int i = 2; i <= n; i++)
{
for (int j = i - 1; j > 0; j--)
{
dp[j][i] = 987654321;
for (int k = j; k <= i; k++)
dp[j][i] = min(dp[j][i], dp[j][k] + dp[k + 1][i]);
dp[j][i] += pSum[i] - pSum[j - 1];
}
}
위의 코드가 위의 그림과 같은 역할을 하게 된다.
dp[j][i]의 최소비용을 찾기 위해서는 그 사이에 있는 모든 dp[j][k]와 dp[k+1][i] 사이의 최소를 찾으면 된다.
소스 코드 :
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <iostream> #include <cstdio> #include <algorithm> #include <memory.h> using namespace std; int dp[502][502]; int arr[502]; int pSum[502]; int main() { int tc; scanf("%d", &tc); while (tc--) { memset(dp, 0, sizeof(dp)); memset(arr, 0, sizeof(arr)); int n; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &arr[i]); pSum[i] = pSum[i - 1] + arr[i]; } for (int i = 2; i <= n; i++) { for (int j = i - 1; j > 0; j--) { dp[j][i] = 987654321; for (int k = j; k <= i; k++) dp[j][i] = min(dp[j][i], dp[j][k] + dp[k + 1][i]); dp[j][i] += pSum[i] - pSum[j - 1]; } } printf("%d\n", dp[1][n]); } return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[1254번] 팰린드롬 만들기 (0) | 2017.11.19 |
---|---|
[14846번] 직사각형과 쿼리 (4) | 2017.11.17 |
[11495번] 격자 0 만들기 (2) | 2017.11.15 |
[1658번] 돼지 잡기 (2) | 2017.11.14 |
[2866번] 문자열 잘라내기 (0) | 2017.11.13 |