Description
Input
Output
Sample Input
6 10 1 50 50 20 5
Sample Output
3650
题解: 设dp[i][[j] 为从i到j取完出了a[i]和a[j]这两个数的最小代价。最终所要求出的是dp[1][n]。
假设在i到j区间内最后一个取a[k],那么子问题便可以看得出来:求出dp[i][k]和dp[k][j]的最小代价,求出这两个子问题的代价再加上最后一个取出a[k]的代价,即为dp[i][j]的代价。
问题转化为求出子问题的代价,直到只剩下三个数为止,三个数只能取中间的数。
#include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #define lson o << 1, l, m #define rson o << 1|1, m+1, r using namespace std; typedef long long LL; const int MAX=0x3f3f3f3f; const int maxn = 100+10; int n, dp[maxn][maxn], a[maxn]; int main() { scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); for(int i = 2; i <= n-1; i++) dp[i-1][i+1] = a[i-1]*a[i]*a[i+1]; //边界,三个数只能取中间的数 for(int len = 4; len <= n; len ++) for(int i = 1; i <= n-len+1; i++) { int j = i+len-1; dp[i][j] = MAX; for(int k = i+1; k <= j-1; k++) dp[i][j] = min(dp[i][j], dp[i][k]+dp[k][j] + a[j]*a[k]*a[i]); } printf("%d\n", dp[1][n]); return 0; }
POJ 1651 Multiplication Puzzle (区间DP),布布扣,bubuko.com
POJ 1651 Multiplication Puzzle (区间DP)
原文地址:http://blog.csdn.net/u013923947/article/details/38381031