- 1、本文档共29页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法回溯递归动态贪心分支综合代码
//3d1-2 矩阵连乘 动态规划迭代实现
//A1 30*35 A2 35*15 A3 15*5 A4 5*10 A5 10*20 A6 20*25
//p[0-6]={30,35,15,5,10,20,25}
//#include stdafx.h
#include iostream
using namespace std;
const int L = 7;
int MatrixChain(int n,int **m,int **s,int *p);
void Traceback(int i,int j,int **s);//构造最优解
int main()
{ int p[L]={30,35,15,5,10,20,25};
int **s = new int *[L];
int **m = new int *[L];
for(int i=0;iL;i++)
{ s[i] = new int[L];
m[i] = new int[L];
} cout矩阵的最少计算次数为:MatrixChain(6,m,s,p)endl;
cout矩阵最优计算次序为:endl;
Traceback(1,6,s);
return 0;
}int MatrixChain(int n,int **m,int **s,int *p)
{ for(int i=1; i=n; i++)
{ m[i][i] = 0;
}
for(int r=2; r=n; r++) //r为当前计算的链长(子问题规模)
{ for(int i=1; i=n-r+1; i++)//n-r+1为最后一个r链的前边界
{ int j = i+r-1;//计算前边界为r,链长为r的链的后边界
m[i][j] = m[i+1][j] + p[i-1]*p[i]*p[j];//将链ij划分为A(i) * ( A[i+1:j] )
s[i][j] = i;
for(int k=i+1; kj; k++)
{ //将链ij划分为( A[i:k] )* (A[k+1:j])
int t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];
if(tm[i][j])
{ m[i][j] = t;
s[i][j] = k;
}
}
}
}
return m[1][L-1];
}
void Traceback(int i,int j,int **s)
{ if(i==j) return;
Traceback(i,s[i][j],s);
Traceback(s[i][j]+1,j,s);
coutMultiply Ai,s[i][j];
cout and A(s[i][j]+1),jendl;
}
#include stdio.h
#include string
#includeiostream
using namespace std;
string pre,post;//确定的先后序
//已知中序和后序确定先序
void Preorder(string a, string b)//a中序b后序
{ int r=a.find(b.substr(b.length()-1,1));//在后序中找根节点
pre+=a[r];
if(r0)
Preorder(a.substr(0,r),b.substr(0,r));
if(ra.length()-1)
Preorder(a.substr(r+1, a.length()-r-1), b.substr(r, b.length()-r-1));//递归分割
}
//已知先序和中序确定后序
void Postorder(string a, string b)//a中序b先序
{ int r=a.find(b.substr(0,1));//在前序中找根节点
if(r0)
Postorder(a.substr(0,r),b.substr(1,r));
if(ra.length()-1)
Postorder(a.substr(r+1, a.length()-r-1), b.substr(r+1, b.length()-r-1));//递归分割
post+=a[r];
}
void main()
{ while(true)
{ int choice = 0;
string p1,p2;
cout 输入选择:(数字) endl;
cout 1.已知后序和中序序列,求先序序列: endl
文档评论(0)