矩阵链乘问题 自己真的对不起线性老师啊 这个题的难点在与输出路径 不妨用一个vis数组来记录一下 然后回溯输出。。。
#include <algorithm> #include <cstring> #include <cstdio> struct dat { int x,y; } a[12]; int vis[12][12]; int n; int dp[20][20]; int dfs(int x, int y) { if(x>=y) return 0; if(dp[x][y]!=-1) return dp[x][y]; dp[x][y]=0x7fffffff; for(int i=x; i<=y; i++) { int m=dfs(x,i)+dfs(i+1,y)+a[x].x*a[i].y*a[y].y; if(dp[x][y]>m) { dp[x][y]=m; vis[x][y]=i; } } return dp[x][y]; } void print(int x, int y) { if(x==y) printf("A%d",x+1); else { printf("("); print(x,vis[x][y]); printf(" x "); print(vis[x][y]+1,y); printf(")"); } } int main() { int cas=0; while(scanf("%d",&n)==1 && n) { cas++; for(int i=0; i<n; i++) scanf("%d %d",&a[i].x,&a[i].y); memset(dp, -1, sizeof(dp)); memset(vis, -1, sizeof(vis)); dfs(0,n-1); printf("Case %d: ",cas); print(0,n-1); puts(""); } return 0; }