题目大意:给出N个矩阵,要求所有矩阵相乘的值达到最小值
解题思路:dp[begin][end] = min (dp[begin][k] + dp[k+1][end] + row[begin] * col[k] * col[end]),输出的时候比较难 ,用一个 数组记录断点所在的位置,当断点的位置等于他本身的时候,则得出该矩阵的值,输出该值,递归结束
#include<cstdio>
#include<cstring>
#define maxn 15
int 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;
}