程序设计基础12_2_动态规划(2015春)讲解.ppt

程序设计基础12_2_动态规划(2015春)讲解.ppt

  1. 1、本文档共43页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
程序设计基础12_2_动态规划(2015春)讲解

int main() { int n, m, i, j; //m存放ai左边各终点 //最长上升子序列长度的最大值 scanf(“%d”,n); //输入序列长度n for(i=1; i=n; i++) scanf(“%d”,b[i]); //输入n个整数b[i] MaxLen[1]=1; //初始化以第一个数为 //终点的最长上升子序列长度1 for(i=2; i=n; i++) //求以ai为终点的 { m=0; //最长上升子序列长度 for(j=1; ji; j++) //循环找aj左边最长上 if(a[i] a[j]) //小于升子序列长度 if(mMaxLen[j]) m=MaxLen[j]; MaxLen[i]=m+1; } int nMax = -1; //初始化nMax //循环求以ak为终点的 //最长上升子序列最大长度 for(i=1; i=n; i++) if(nMax MaxLen[i]) nMax = MaxLen[i]; printf(“%d\n”,nMax); //输出最大长度 return 0; } * 方案二:动态规划DP的实现 nMax = Max{ MaxLen(i), i=1,2,3, … ,n } MaxLen (1) = 1 MaxLen (i) = Max { MaxLen (j):1j i 且 bj bi 且 i≠1 } + 1 特别提醒:教材p297 状态转移方程 —— 源程序 a —— 教材中数组 b k —— 教材中变量 i i —— 教材中变量 j 第12章 贪心法与动态规划 * 12.1.3贪心法解题的一般步骤 贪心法特点,就是在求最优解的过程中,每一步都采用一种局部最优策略,逐渐缩小问题范围和规模,最后把每一步结果合并起来得到一个全局的最优解。 在例12.1中,每次选取删除的数字都是第一个递减区间的首位数字,也就是当前的删除可以保证在当前删除位数要求下的最优解,同时使剩下的数字串逐渐接近最后要求的目标最优解。 * 在例12.2中,每一次选取的时间都是满足条件的最早结束事件,向问题的解答前进一步,同时给剩余事件的选取留下了最多的不重叠时间;最后得到的事件序列,就是每一次选取的事件集合。 在例12.3中,每一步都将覆盖最大间隔的线段断开,使得线段总长度减少,同时使线段数目更接近最大数目限制;最后得到的最小线段总长度,其实是计算过程唯一确定的一种线段覆盖方式得到的。 贪心法解题的一般步骤 从问题的某个初始解出发; 采用循环语句,当可以向求解目标前进一步时,根据局部最优策略,得到一个部分解,缩小问题的范围或规模; 将所有部分解综合起来,得到问题的最终解。 * 12.1 贪 心 法 12.2 动 态 规 划 * 引例 递归的重叠子问题 斐波那契序列:f(1)=1; f(2)=1; f(n)=f(n-1)+f(n-2); (n2) * 递归实现 long long f(int n) { if(n==1||n==2) return 1; return f(n-1)+f(n-2); } f(6)=f(5)+f(4) =f(4)+f(3)+f(4) 动态规划DP实现 long long f(int n) { int i; long long a[100]; a[1]=1;a[2]=1; for(i=3; i=n;i++) a[i]=a[i-1]+a[i-2]; return a[n-1]; } n 40 90 递归:1.030s 无法忍受 动规:0.062s 0.359 特点: 空间换时间 不重复求解 引例 递归的重叠子问题 * 递归调用中,计算f(6)和f(5)都需要去计算f(4),导致对同一个值f(4)计算了两次,浪费了时间,我们把这种情况叫做递归的重叠子问题。 一种避免递归的重叠子问题的方法就是,当我们求出一个值的时候,就把它保存起来,当下次再用到这个值的时候,直接调用保存的值,而不是再计算一次。 递归算法的问题:子问题被重

文档评论(0)

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

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

1亿VIP精品文档

相关文档