zoj 1602 Multiplication Puzzle

来源:互联网 发布:webstorm js代码提示 编辑:程序博客网 时间:2024/04/30 14:13

寒假已经过去那么几天了,加油了,这个寒假很关键很关键!

/*dp不错的一道题。状态方程dp[i][j]=min{dp[i][k]+dp[k][j]+num[i]*num[k]*num[j]} (i<k<j)dp[i][j]表示第i个元素到第j个元素按照游戏规则所得的最优解。Process:1.一开始一直想成 dp[i][j]=min{dp[i][k]+dp[k][j]+num[k-1]*num[k]*num[k+1]} (i<k<j)  然后发现上面式子明显就错了,因为这样表示先取出num[k],可是取了k之后他两边的元素明显  会受到影响。。2.N久之后才转过弯来,应该是num[k]作为最后取的元素,这样就不影响其余元素状态了。  所以很多时候反向考虑问题是很重要的!*/#include <iostream>#include <cstdio>#include <limits.h>using namespace std;int num[110];int dp[110][110];int main(){    int n,i,j,k,mini;    while( cin>>n )    {        for( i=0;i<n;i++ )            cin>>num[i];        for( i=0;i<=n-2;i++ )            dp[i][i+1]=0;        for( j=2;j<=n-1;j++ )        {            for( i=0;i<=n-1-j;i++ )            {                mini=INT_MAX;                for( k=i+1;k<i+j;k++ )                    if( mini>dp[i][k]+dp[k][i+j]+num[i]*num[k]*num[i+j] )                        mini=dp[i][k]+dp[k][i+j]+num[i]*num[k]*num[i+j];                dp[i][i+j]=mini;            }        }        cout<<dp[0][n-1]<<endl;    }    return 0;}


原创粉丝点击