小白算法练习 区间dp 乘法游戏

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


猜你喜欢

转载自blog.csdn.net/qq_36336522/article/details/79946805