乘法游戏是在一行牌上进行的。每一张牌包括了一个正整数。在每一个移动中,玩家拿出一张牌,得分是用它的数字乘以它左边和右边的数,所以不允许拿第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;
}
<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;
}