矩阵连乘问题
2013-10-16 17:12
155 查看
做好充足的准备,你才能在机会到来时狠狠的抓住它!Come on!
#include <cstdio> #include <cstring> const int INF=100; int m[INF][INF],s[INF][INF],p[INF]; // m[i][j]表示从第i个矩阵到第j个矩阵连乘需要进行乘法计算的次数 // s[i][j]=k 表示:m[i][j]最小时,应先计算第ige矩阵到第k个矩阵的乘积, //再计算第k+1个矩阵到第j个矩阵的乘积,然后在计算所得两个矩阵的乘积 //p[i-1]记录的是第i个矩阵的行数,p[i]记录的是第i个矩阵的列数 void MatrixChain(int n) { for(int i=0;i<=n;i++) m[i][i]=s[i][i]=0; for(int k=2;k<=n;k++) //k表示连乘的矩阵的个数 { for(int i=1;i<=n-k+1;i++) { int j=i+k-1; m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j]; s[i][j]=i; for(int t=i+1;t<j;t++) { int temp=m[i][t]+m[t+1][j]+p[i-1]*p[t]*p[j]; if(temp<m[i][j]) { m[i][j]=temp; s[i][j]=t; } } } } } void Traceback(int i,int j) { if(i==j) return; Traceback(i,s[i][j]); Traceback(s[i][j]+1,j); printf("A[%d:%d]*A[%d:%d]\n",i,s[i][j],s[i][j]+1,j); } int main() { int n; while(~scanf("%d",&n)) { for(int i=0;i<=n;i++) scanf("%d",&p[i]); MatrixChain(n); Traceback(1,n); } return 0; }