描述
乘法游戏是在一行牌上进行的。每一张牌包括了一个正整数。在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第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的整数,用空格分开。
输出格式
输出文件只有一个数字:最小得分
测试样例1
输入
6 10 1 50 50 20 5
输出
3650
/*枚举区间内最后一个乘数*/#include#include #include #include #include #define ll long longusing namespace std;const int maxn = 125;const ll inf = 987654321234LL;ll read(){ char ch=getchar(); ll x=0,f=1; while(!(ch>='0'&&ch<='9')){ if(ch=='-')f=-1;ch=getchar();}; while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();}; return x*f;}int n;ll a[maxn],dp[maxn][maxn];int main(){ n = read(); for(int i = 1;i <= n;i++) a[i] = read(); for(int i = 0;i <= n;i++){ for(int j = 0;j <= n;j++){ dp[i][j] = inf; } } for(int i = 1;i < n;i++){ dp[i][i+1] = 0; } int j; for(int l = 3;l <= n;l++){ for(int i = 1;i <= n-l+1;i++){ j = i + l - 1; for(int k = i + 1;k <= j-1;k++){ dp[i][j] = min(dp[i][j],dp[i][k] + dp[k][j] + a[i]*a[k]*a[j]); } } } cout<