POJ 1651 Multiplication Puzzle

来源:互联网 发布:java final class 编辑:程序博客网 时间:2024/05/16 09:44

简单的区间dp。

dp状态描述:dp(i,j)将第i个到第j个全部取走的最小花费。

dp状态方程:dp(i,j)=min(dp(i,k-1)+cost(k)+dp(k+1,j))。

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define maxn 111#define inf 100000005int dp[maxn][maxn];int v[maxn];int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        memset(dp,0,sizeof(dp));        int i,j,k;        for(i=1;i<=n;i++)  scanf("%d",&v[i]);        for(i=2;i<n;i++)  dp[i][i]=v[i-1]*v[i]*v[i+1];        for(k=1;k<n-2;k++)        {            for(i=2;i+k<n;i++)            {                dp[i][i+k]=inf;                for(j=i;j<=i+k;j++)                {                    dp[i][i+k]=min(dp[i][i+k],dp[i][j-1]+v[i-1]*v[j]*v[i+k+1]+dp[j+1][i+k]);                }            }        }        printf("%d\n",dp[2][n-1]);    }    return 0;}


0 0
原创粉丝点击