- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话: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)计算了两次,浪费了时间,我们把这种情况叫做递归的重叠子问题。 一种避免递归的重叠子问题的方法就是,当我们求出一个值的时候,就把它保存起来,当下次再用到这个值的时候,直接调用保存的值,而不是再计算一次。 递归算法的问题:子问题被重
                您可能关注的文档
最近下载
- 基于隐私保护的社会性别劳动分工信息共享底层协议与算法实现.pdf VIP
 - 根据多波束水深数据估算人工鱼礁空方量的方法.pdf VIP
 - 如何理解“作风建设永远在路上,永远没有休止符”?我们应如何加强作风建设? (3) .doc VIP
 - 2025年咨询工程师环保项目现金流量表的编制与环境效益量化专题试卷及解析.pdf VIP
 - 联通华盛终端连锁化运营项目-销售管理培训.pdf VIP
 - 临时用电验收要点:国标GB50194-2014.pdf VIP
 - 综合交通运输体系规划编制技术导则.pdf
 - 2025至2030中国铝合金压铸件行业投资策略及应用需求潜力研究报告.docx VIP
 - 医院重大事件请示报告制度.docx VIP
 - 金风25MW机组运行维护手册.pdf VIP
 
原创力文档
                        

文档评论(0)