关于动态规划矩阵连乘的心得体会

时间:2021-06-24 16:44:38

矩阵连乘问题动态规划算法 

/*
Name: 矩阵连乘问题动态规划算法
Copyright:
Author:cc
Date: 16/05/17 20:18
Description: 对于输入的子串30,35,15,5,10,20,25,首先自低向上由最优解包含着子问题的最优解思想关联算出( 重点在这)
12,23,34,45,56,123,234,345,456...字符串逐渐增长的最优解,每个字符串只有一个最优解,例如:12之间最优解x,13之间最优解y,23之间最优解z,
123之间最优解由x+3,y+2,z+1中比较后选择最小的那一个得出,减少了计算量.
*/
#include<iostream>
using namespace std;
void MS(int p[],int n,int m[7][7],int s[7][7])
{
for(int i = 1; i <= n; i++)
m[i][i] = 0;
for(int r = 2; r <= n; r++)
for(int i = 1; i <= n-r+1; i++)
{
int j = i+r-1;
m[i][j] = m[i+1][j] + p[i-1]*p[i]*p[j];//计算出m[i][j]的数值
s[i][j] = i;
for(int k = i+1; k < j; k ++)
{
//利用已经得出的m[][]二维表 ,计算上面所得m[i][j]是否为 j-i长度字符串断开时的最小计算长度
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 Solution(int i,int j, int s[7][7]) //根据记录得出输出结果
{
if(i == j)
return;
Solution(i,s[i][j],s);
Solution(s[i][j]+1,j,s);
cout<<"A"<<i<<","<<s[i][j];
cout<<"and A"<<(s[i][j]+1)<<","<<j<<endl;
}
int main()
{
int p[7]={4,30,15,5,20,25,45};//输入示例字符串
int m[7][7],s[7][7];
MS(p,6,m,s);
Solution(1,6,s);
return 0;
}