uva348 - Optimal Array Multiplication Sequence(简单动规)

来源:互联网 发布:佰迪欧百信渔具淘宝店 编辑:程序博客网 时间:2024/06/06 03:56

矩阵相乘求最小运算次数。

经典的动规题目。

代码如下;

#include <cstdio>#define N 20#define INF 0x7fffffffint n, a[N][2], d[N][N], pa[N][N];void dp(){    for(int i = 0; i < n; i++) d[i][i] = 0;    for(int len = 1; len < n; len++)    {        for(int s = 0; s < n-len; s++)        {            int min = INF, minx;            for(int k = s; k < s+len; k++)            {                int tt = d[s][k]+d[k+1][s+len]+a[s][0]*a[k][1]*a[s+len][1];                if(min>tt) {min = tt; minx = k;}            }            d[s][s+len] = min; pa[s][s+len] = minx;        }    }}void print_ans(int s, int e){    if(s==e)    {        printf("A%d",s+1);        return;    }    printf("(");    print_ans(s,pa[s][e]);    printf(" x ");    print_ans(pa[s][e]+1,e);    printf(")");}int main (){    int cas = 0;    while(scanf("%d",&n), n)    {        for(int i = 0; i < n; i++) scanf("%d%d",&a[i][0], &a[i][1]);        dp();        printf("Case %d: ",++cas);        print_ans(0,n-1);        printf("\n");    }    return 0;}


 

原创粉丝点击