- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法分析与的设计第6章_动态规划.ppt
最长递增子序列问题——想法 如何定义子问题? 设L(n)为数字序列A={a1, a2, …, an}的最长递增子序列的长度,显然,初始子问题是{a1},即L(1)=1。考虑原问题的一部分,设L(i)为子序列A={a1, a2, …, ai}的最长递增子序列的长度,则满足如下递推式: 1 i = 1或不存在ajai(1≤j<i) max{L(j) + 1} 对于所有的ajai(1≤j<i) L(i) = * 第6章 动态规划法 Page * 对于序列A={5, 2, 8, 6, 3, 6, 9, 7},用动态规划法求解最长递增子序列。 首先计算初始子问题,可以直接获得: L(1)=1({5}) 然后依次求解下一个阶段的子问题,有: L(2)=1({2}) L(3)=max{L(1)+1, L(2)+1}=2({5, 8}, {2, 8}) L(4)= max{L(1)+1, L(2)+1}=2({5, 6}, {2, 6}) L(5)=L(2)+1=2({2, 3}) L(6)=max{L(1)+1, L(2)+1, L(5)+1)}=3({2, 3, 6}) L(7)=max{L(1)+1, L(2)+1, L(3)+1, L(4)+1, L(5)+1, L(6)+1}=4({2, 3, 6, 9}) L(8)=max{L(1)+1, L(2)+1, L(4)+1, L(5)+1, L(6)+1}=4({2, 3, 6, 7}) 序列A的最长递增子序列的长度为4,有两个最长递增子序列,分别是{2, 3, 6, 9}和{2, 3, 6, 7})。 最长递增子序列问题——实例 * 第6章 动态规划法 Page * i 1 2 3 4 5 6 7 8 ai 5 2 8 6 3 6 9 7 L(i) 1 1 2 2 2 3 4 4 Bi {5} {2} {5,8},{2,8} {5,6},{2,6} {2,3} {2,3,6} {2,3,6,9} {2,3,6,7} 最长递增子序列问题——实例(填表) * 第6章 动态规划法 Page * 设序列A存储在数组a[n]中,数组L[n]存储最长递增子序列的长度,其中L[i]表示元素序列a[0]~a[i]的最长递增子序列的长度,二维数组x[n][n]存储对应的最长递增子序列,其中x[i][n]存储a[0]~a[i]的最长递增子序列,注意到数组下标均从0开始,给出用C++语言描述的算法。 最长递增子序列问题——算法 * 第6章 动态规划法 Page * * Chapter 6 Dynamic Programming * int increaseOrder(int a[], int n){ int i, j, k, index; int L[10], x[10][10]; for(i=0; in; i++){ //初始化 L[i]=1;x[i][0]=a[i]; } for(i=1; in; i++){ //依次计算a[0]~a[i]的最长递增子序列 int max=1; for(j=i-1; j=0; j--){ if((a[j]a[i])(maxL[j]+1)){ //对所有的ajai max=L[j]+1;L[j]=max; for(k=0; kmax-1; k++) x[i][k]=x[j][k]; //将j对应的子序列复制到i x[i][max-1]=a[i]; //将ai接到前面的子序列最后 } } } 最长递增子序列问题——算法 * Chapter 6 Dynamic Programming * for(index=0, i=1; in; i++) //求所有递增子序列的最大长度 if(L[index]L[i]) index=i; cout“最长递增子序列是:”; for(i=0; iL[index]; i++) //输出最长递增子序列 coutx[index][i]“ “; return L[index]; //返回最长递增子序列的长度 } [算法分析] 设序列A的长度为n,算法依次对每一个序列元素进行计算,在求解L[i]时需要考察a[0]~a[i-1]是否小于a[i],因此其时间复杂性为O(n2)。 最长递增子序列问题——算法 * Chapter 6 Dynamic Programming * 6.3 组合问题中的动态规划法 6.3.1 最长递增子序列问题 6.3.2 最长公共子序列问题 6.3.3 0/1背包问题 * C
文档评论(0)