关于动态规划矩阵连乘的心得体会
2017-06-15 19:52
288 查看
矩阵连乘问题动态规划算法
/*
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;
}
/*
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;
}
相关文章推荐
- 关于通过ODBC访问NOTES的心得体会
- 关于windows程序设计的心得体会
- 关于 Spring Ioc annotation 的心得体会
- 关于调试过程中单片机复位的几点心得与体会
- 关于软件权限设置的一点心得体会
- 矩阵连乘 动态规划(转载)
- 心得体会:关于开发效率和项目周期的问题
- 关于OR-Mapping的学习心得体会
- 关于OR-Mapping的学习心得体会
- 关于Win7的域用户 安装Oracle的心得体会
- 心得体会:关于开发效率和项目周期的问题
- 关于软件设计的一点心得体会
- 经验交流:关于软件设计的一点心得体会
- 关于Hiberante存储CLOB的一些心得体会
- 关于软件权限设置的一点心得体会
- Marketing Case ----职场心得:关于资源整合!个人的体会
- 心得体会:关于开发效率和项目周期的问题
- 关于OR-Mapping的学习心得体会
- 我今天的工作日志——关于事件委托的一点心得体会
- 使用动态规划写出的矩阵连乘