算法回溯递归动态贪心分支综合代码.doc

  1. 1、本文档共29页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

wyjy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档