标签:one point mod clu name poj 1651 card rip using
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)
标签:one point mod clu name poj 1651 card rip using
原文地址:https://www.cnblogs.com/zhchoutai/p/8848622.html