알고리즘/acmicpc
11049
kwony
2016. 7. 24. 12:14
DP의 예시로 알고리즘 책에서 자주 나오는 유형
DP는 배열의 인덱스 값을 얼마나 유용하게 잘 사용하느냐에 달려있는 것 같다.
dp[FROM][TO] : FROM부터 TO까지의 행렬들을 곱할 때의 값
위 값을 통해서 지속적으로 업데이트 해나가면 문제를 풀 수 있다.
#include<cstdio>
#define MAXN 500
int dp[MAXN][MAXN];
int data[MAXN][2];
int main() {
int N;
int i, j, len;
freopen("input.txt", "r", stdin);
scanf("%d", &N);
for (i = 0; i < N; i++)
scanf("%d%d", &data[i][0], &data[i][1]);
for (len = 1; len < N; len++) {
for (i = 0; i + len < N; i++) {
for (j = i; j < i+len; j++) {
if (dp[i][i + len] == 0 ||
dp[i][i + len] > dp[i][j] + dp[j + 1][i + len] + data[i][0] * data[j + 1][0] * data[i + len][1])
dp[i][i + len] = dp[i][j] + dp[j + 1][i + len] + data[i][0] * data[j + 1][0] * data[i + len][1];
}
}
}
printf("%d\n", dp[0][N - 1]);
return 0;
}