UVA - 348 Optimal Array Multiplication Sequence

来源:互联网 发布:网络排行榜龙空 编辑:程序博客网 时间:2024/05/01 11:07
题意:矩阵连乘问题
#include <iostream>#include <cstdio>#include <cstring>#include <climits>using namespace std;const int MAXN = INT_MAX;int n;struct node{    int a,b;}arr[15];int dp[20][20];int p[20][20];int Mark(){    for (int i = 1; i <= n; i++)        dp[i][i] = 0;        for (int r = 2; r <= n; r++)        for (int i = 1; i <= n - r + 1; i++){            int j = i + r -1;            dp[i][j] = dp[i+1][j] + arr[i].a * arr[i].b * arr[j].b;            p[i][j] = i;            for (int k = i + 1; k < j; k++){                int t = dp[i][k] + dp[k+1][j] + arr[i].a * arr[k].b * arr[j].b;                if (t < dp[i][j]){                    dp[i][j] = t;                    p[i][j] = k;                }            }        }}void prin(int x,int y){    if (y - x == 0){        printf("A%d",x);        return;    }    if (y - x == 1){        printf("(A%d x A%d)",x,y);        return;    }    int t = p[x][y];    printf("(");    prin(x,t);    printf(" x ");    prin(t+1,y);    printf(")");}int main(){    int cas = 0;    while (++cas){        scanf("%d",&n);        if (!n)            break;        for (int i = 1; i <= n; i++)            scanf("%d%d",&arr[i].a,&arr[i].b);        printf("Case %d: ",cas);        Mark();        prin(1,n);        printf("\n");    }    return 0;}


原创粉丝点击