矩阵连乘――动态规划

匿名 (未验证) 提交于 2019-12-03 00:15:02







#include<bits/stdc++.h> #define maxn 105 using namespace std; int n,p[1000];//每个矩阵的行数和列数 int m[100][100];//存储最优子结构 int s[100][100];//存储当前结构的最优断点 void MatrixChain() {     for(int i=1; i<=n; i++) { //初始化主对角线为0,矩阵链长度为1         m[i][i] = 0;          }     for(int r=2; r<=n; r++) {  //依次计算第r条对角线         for(int i=1; i<=n-r+1; i++) {   //每条对角线 的长度             int j = i+r-1;    //对角线上每个元素的下标,i行j列             m[i][j] = m[i][i]+m[i+1][j] +p[i-1]*p[i]*p[j],s[i][j] = i;             for(int k=i+1;k<j;k++){   //枚举计算m[i][j]的最优解                 int t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];                 if(t<m[i][j]){                     m[i][j] = t;                     s[i][j] = k;                 }             }         }     } } void Traceback(int i,int j){     if(i==j){         return;     }     Traceback(i,s[i][j]);     Traceback(s[i][j]+1,j);     cout<<"Multiply A"<<i<<", "<<s[i][j];     cout<<"and A"<<s[i][j]+1<<", "<<j<<endl; } int main()  {     memset(p,0,sizeof(p));     memset(m,0,sizeof(m));     memset(s,0,sizeof(s));     cin >> n;     for(int i=0;i<=n;i++){         cin >> p[i];     }     MatrixChain();     cout <<m[1][n]<<endl;     Traceback(1,n);     return 0; } /* 6 30 35 15 5 10 20 25 15125 */
View Code

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!