348 - Optimal Array Multiplication Sequence

来源:互联网 发布:网络上的v是什么意思 编辑:程序博客网 时间:2024/05/01 16:17
描述:状态转移方程min(v,dp(x,i)+dp(i+1,y)+num[x][0]*num[i][1]*num[y][1]);数据量只有10,不大,主要是存储步骤#include <cstdio>#include <cstring>int num[15][2],s[15][15],count[15][15];int dp(int x,int y){    int &v=count[x][y];    if(v) return v;    for(int i=x; i<y; i++)    {        int t=dp(x,i)+dp(i+1,y)+num[x][0]*num[i][1]*num[y][1];        if(!v||t<v)        {            v=t;            s[x][y]=i;        }    }    return v;}void show(int x,int y){    if(x==y) printf("A%d",x+1);    else    {        printf("(");        show(x,s[x][y]);        printf(" x ");        show(s[x][y]+1,y);        printf(")");    }}int main(){    int n,m=1;    //freopen("a.txt","r",stdin);    while(scanf("%d",&n)!=EOF)    {        if(!n) break;        for(int i=0; i<n; i++) scanf("%d %d",&num[i][0],&num[i][1]);        memset(s,-1,sizeof(s));        memset(count,0,sizeof(count));        printf("Case %d: ",m++);        dp(0,n-1);        show(0,n-1);        printf("\n");    }    return 0;}

原创粉丝点击