描述
乘法游戏是在一行牌上进行的。每一张牌包括了一个正整数。在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第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<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #define ll long long using 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<<dp[1][n]; return 0; }
时间: 2024-10-26 12:00:39