最小矩阵乘法次数
#include<stdio.h> #include<string.h> void printOptimalParens(int s[][100],int i,int j){ if(i==j)printf("A%d",i); else{ printf("("); printOptimalParens(s,i,s[i][j]); printOptimalParens(s,s[i][j]+1,j); printf(")"); } } int main(){ int t; scanf("%d",&t); //表示有t个矩阵相乘 int p[100]; //p数组是储存每个矩阵的行列 第i个矩阵的行列就是p[i-1],p[i] int m[100][100]; //m数组是存i和j之间的加括号的最小代价问题 int s[100][100]; memset(m,0,sizeof(m)); memset(s,0,sizeof(s)); for(int i=0;i<=t;i++){ //输入并且初始化m scanf("%d",&p[i]); if(i<=t)m[i][i]=0; } for(int l=2;l<=t;l++){ for(int i=1;i<=t-l+1;i++){ int j=i+l-1; m[i][j]=999999; int k; printf("计算矩阵%d和%d之间的最优解:",i,j); for(k=i;k<=j-1;k++){ int q=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]; if(q<m[i][j]){ m[i][j]=q; s[i][j]=k; } } printf("%d,%d之间最优解是%d\n",i,j,s[i][j]); } } /*输出m*/ for(int i=1;i<=t;i++){ for(int j=1;j<=t;j++){ printf("%-6d",m[i][j]); } printf("\n"); } printf("\n"); /*输出s*/ for(int i=1;i<=t;i++){ for(int j=1;j<=t;j++){ printf("%-6d",s[i][j]); } printf("\n"); } printf("\n"); /*输出带括号的矩阵*/ printf("用括号表示矩阵相乘的先后顺序是:"); printOptimalParens(s,1,t); printf("\n"); return 0; }
posted on 2012-12-16 23:29 Aquariuslt 阅读(498) 评论(0) 收藏 举报
浙公网安备 33010602011771号