标签:
区间DP。dp[i][j]表示(i,j)开区间内全部取走的最小值。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int INF=0x7FFFFFFF; const int maxn=100+10; int a[maxn]; int dp[maxn][maxn]; int n; void init() { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) dp[i][j]=INF; for(int i=1;i<=n;i++) if(i+2<=n) dp[i][i+2]=a[i]*a[i+1]*a[i+2]; } void work() { for(int i=4;i<=n;i++) { for(int j=1;j<=n;j++) { int st=j,en=st+i-1; if(en>n) continue; for(int s=st+1;s<=en-1;s++) //a[s]最后取走 { int now=0; if(s-st>=2) now=now+dp[st][s]; if(en-s>=2) now=now+dp[s][en]; now=now+a[st]*a[s]*a[en]; dp[st][en]=min(dp[st][en],now); } } } printf("%d\n",dp[1][n]); } int main() { while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) scanf("%d",&a[i]); init(); work(); } return 0; }
POJ 1651 Multiplication Puzzle
标签:
原文地址:http://www.cnblogs.com/zufezzt/p/5215335.html