乘法游戏是在一行牌上进行的。每一张牌包括了一个正整数。在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第1张和最后1张牌。最后一次移动后,这里只剩下两张牌。 你的目标是使得分的和最小。
例如,如果数是10 1 50 20 5,依次拿1、20、50,总分是10*1*50+50*20*5+10*50*5=8000
而拿50、20、1,总分是1*50*20+1*20*5+10*1*5=1150。
输入文件的第一行包括牌数(3< =n< =100),第二行包括N个1-100的整数,用空格分开。
输出文件只有一个数字:最小得分
样例输入
6 10 1 50 50 20 5
样例输出
3650
#include<iostream> #include<cstring> using namespace std; const int maxm=1111; int d[maxm],N; long long dp[maxm][maxm]; const int INF=0x3f3f3f; void dypro() { for(int k=3;k<=N;k++) { for(int i=1;i<=N;i++) { int j=i+k-1; if(j>N) break; dp[i][j]=INF; if(k==3) { dp[i][j]=d[i]*d[i+1]*d[i+2]; } else { for(int l=i+1;l<j;l++) { dp[i][j]=min(dp[i][j],dp[i][l]+dp[l][j]+d[l]*d[i]*d[j]); } } } } } int main() { memset(dp,0,sizeof(dp)); cin>>N; for(int i=1;i<=N;i++) { cin>>d[i]; } dypro(); cout<<dp[1][N]<<'\n'; return 0; }