UVA - 348 Optimal Array Multiplication Sequence

来源:互联网 发布:重装系统后网络不可用 编辑:程序博客网 时间:2024/05/05 08:43

dp矩阵链乘 不解释。最优子结构为最后一个乘号两边的一定也是最优子问题解

#include<cstdio>#include<cstring>#include<algorithm>#define MAX 15using namespace std;int dp[MAX][MAX],father[MAX][MAX],s[MAX+2];void print(int front,int rear){    if(rear-front==1)    {        printf("A%d",front);        return ;    }    printf("(");    print(front,father[front][rear]);    printf(" x ");    print(father[front][rear],rear);    printf(")");    return ;}int main(){    int n,i,j,t,cases=1;;    while(scanf("%d",&n)&&n)    {        scanf("%d",&s[1]);        for(i=2;i<=n;i++)        {            scanf("%d",&s[i]);            scanf("%d",&s[i]);        }        scanf("%d",&s[i]);        memset(dp,0,MAX*MAX*4);        memset(father,0,MAX*MAX*4);        for(i=2;i<=n;i++)        {            for(j=1;j<=n-i+1;j++)            {                for(t=j+1;t<j+i;t++)                {                    if(dp[j][j+i]==0)                    {                        dp[j][j+i]=dp[j][t]+dp[t][j+i]+s[j]*s[t]*s[j+i];                        father[j][j+i]=t;                    }                    else                    {                        if(dp[j][j+i]>dp[j][t]+dp[t][j+i]+s[j]*s[t]*s[j+i])                        {                            dp[j][j+i]=dp[j][t]+dp[t][j+i]+s[j]*s[t]*s[j+i];                            father[j][j+i]=t;                        }                    }                }            }        }        printf("Case %d: ",cases++);        print(1,n+1);        printf("\n");    }    return 0;}



0 0
原创粉丝点击