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

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

/*
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;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值