UVA - 348 Optimal Array Multiplication Sequence 最优矩阵连乘

来源:互联网 发布:淘宝店海报怎么做 编辑:程序博客网 时间:2024/06/05 23:39

题目大意:给出N个矩阵,要求所有矩阵相乘的值达到最小值

解题思路:dp[begin][end] = min (dp[begin][k] + dp[k+1][end] + row[begin] * col[k] * col[end]),输出的时候比较难 ,用一个 数组记录断点所在的位置,当断点的位置等于他本身的时候,则得出该矩阵的值,输出该值,递归结束

#include<cstdio>#include<cstring>#define maxn 15int N,dp[maxn][maxn],row[maxn],col[maxn],path[maxn][maxn];void print(int a, int b) {if(a == b) {printf("A%d",a+1);return ;}printf("(");print(a,path[a][b]);printf(" x ");print(path[a][b]+1,b);printf(")");}int main() {int mark = 1;while(scanf("%d", &N) != EOF && N) {for(int i = 0; i < N; i++)scanf("%d%d", &row[i],&col[i]);memset(dp,0,sizeof(dp));for(int i = 1; i < N; i++) for(int j = 0; j + i < N; j++) {dp[j][j+i] = 0x3f3f3f3f;for(int k = j; k < i+j; k++) {int temp = dp[j][k] + dp[k+1][j+i] + row[j] * col[k] * col[i+j];if(temp < dp[j][j+i]) {dp[j][j+i] = temp; path[j][j+i] = k;}}}printf("Case %d: ",mark++);print(0,N-1);printf("\n");}return 0;}


0 0