实验二:动态规划.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验二:动态规划 实验目的:理解动态规划的基本思想,理解动态规划算法的两个基本要素最优子结构性质和子问题的重叠性质。熟练掌握典型的动态规划问题。掌握动态规划思想分析问题的一般方法,对较简单的问题能正确分析,设计出动态规划算法,并能快速编程实现。 实验内容:编程实现讲过的例题:最长公共子序列问题、投资问题等。 最长公共子序列 一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=x1, x2,…, xm,则另一序列Z=z1, z2,…, zk是X的子序列是指存在一个严格递增的下标序列 i1, i2,…, ik,使得对于所有j=1,2,…,k有 最长公共子序列的结构 穷举搜索法,需要指数时间。 最长公共子序列问题也有最优子结构性质设序列X=x1, x2, …, xm和Y=y1, y2, …, yn的一个最长公共子序列Z=z1, z2, …, zk,则: 若xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的最长公共子序列; 若xm≠yn且zk≠xm ,则Z是Xm-1和Y的最长公共子序列; 若xm≠yn且zk≠yn ,则Z是X和Yn-1的最长公共子序列。 其中Xm-1=x1, x2, …, xm-1,Yn-1=y1, y2, …, yn-1,Zk-1=z1, z2, …, zk-1。 最长公共子序列问题具有最优子结构性质。 #includestdio.h #includestring.h int lcs_length(char x[], char y[]); int main() { char x[100],y[100]; int len; while(1) { scanf(%s%s,x,y); if(x[0]==0) //约定第一个字符串以‘0’开始表示结束 break; len=lcs_length(x,y); printf(%d\n,len); } } int lcs_length(char x[], char y[] ) { int m,n,i,j,l[100][100]; m=strlen(x); n=strlen(y); for(i=0;im+1;i++) l[i][0]=0; for(j=0;jn+1;j++) l[0][j]=0; for(i=1;i=m;i++) for(j=1;j=n;j++) if(x[i]==y[j-1]) //i,j从1开始,但字符串是从0开始 l[i][j]=l[i-1][j]+1; else if(l[i][j-1]l[i+1][j]) l[i][j]=l[i][j-1]; else l[i][j]=l[i-1][j]; return l[m][n]; } 2.投资问题 例:某公司拟将4万元,向A、B、C三个项目追加投资,三个项目可以有不同的投资额度,相应的效益值如表所示,问如何分配资金,才使总效益值最大?最优值:190 A:递归方法(自顶向下)+备忘录 #include iostream using namespace std; int Value[3][5]={47,51,59,71,76,49,52,61,71,78,46,70,76,88,88}; int MaxValue(int Stage, int Money) { int splitmoney = 0; int tempmax=0; int temp = 0; if(Stage == 1)//边界条件 { return Value[0][Money]; } for(splitmoney = 0 ; splitmoney = Money; splitmoney++) { temp = MaxValue(Stage - 1, splitmoney) + Value[Stage][ splitmoney]; if(tempmax temp) tempmax = temp; } return tempmax; } void main() { cout MaxValue(3,4); } B:动态规划算法(自底向上, 本质上即状态转移方程的非递归实现???) 核心伪代码: int Value[3][5]={47,51,59,71,76,49,52,61,71,78,46,70,76,88,88}; int Money = 4; int MaxValue[3][5] ={0}; int temp = 0; int tempmax = 0; for(int i

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档