

#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 */
来源:博客园
作者:七忆鱼
链接:https://www.cnblogs.com/Lemon1234/p/11772193.html