欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载  

    动态规划速成攻略.doc

    • 资源ID:6357180       资源大小:24.51KB        全文页数:5页
    • 资源格式: DOC        下载积分:2
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要2
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    动态规划速成攻略.doc

    动态规划速成攻略福建泉州一中 倪永毅在全国NOIP复赛中,几乎每年都会出现用动态规划思想来解决的题目,复赛中能否取得好成绩,关键就是看动态规划掌握的情况。那对于从高中入学才开始编程语言的学生来说,有没有一种方法能速成动态规划呢?本人经过几年的信息学奥赛辅导,通过对动态规划试题进行归纳、总结、优化等方面的研究,在这里浅谈下动态规划的速成攻略,不足之处请大家见谅。一、 精练动态规划经典试题动态规划的试题有很多,学生刚开始学习时,一定要精挑细选,让学生做些动态规划入门的题目,这一阶段练习目的主要是让学生掌握好动态规划的一些基本概念,比如阶段、状态、决策、状态转移方程、无后效性、最优性原理等概念。这些题目有:数字三角形(IOI1994)、拦截导弹(NOIP1999)、合唱队形(NOIP2004)、挖地雷(NOIP1996 )二、对动态规划类试题进行分类教学我们把动态规划的试题按照常见的模型把它分类,然后让学生来分类掌握,触类旁通,事半功倍。常见的动态规划可以划分以下几类:1、 线性类动态规划: 典型题目:数字三角形(IOI1994)、拦截导弹(NOIP1999)、合唱队形(NOIP2004),马拦过河卒(NOIP2002),免费馅饼(NOI98),商店购物(IOI95)等2、 合并类动态规划:典型题目:石子合并(NOI95),乘积最大(NOIP2000),能量项链(NOIP2006)、数字游戏(NOIP2003)、添括号问题(NOI96)等3、 背包类动态规划:它包括0/1背包、完全背包、有限背包、有依赖的背包等背包问题是极为经典的模型,其转化与优化也是很重要的。(详细可参考DD engi 写的背包九讲)典型题目:开心的金明(NOIP2006)、采药(NOIP2005)、装箱问题(NOIP2001)、金明的预算方案(noip2006)等4、多线程类动态规划:典型题目:三取方格数(noip2000)、传纸条(noip2008)、巡游加拿大(IOI95)等5、最大子段和模型 联赛还未考到这种模型,其实它也是经典利用动态规划来解决的问题之一。问题原型为求数组中的子数组之和的最大值。用ansi表示包含数列第i项的前i个元素的最大和,数组no存放数列元素,则状态转移方程为:ans0=0;ansi=maxansi-1+noi,noi 时间复杂度为O(n)核心程序代码:best:=-maxlongint;temp:=0;for i:=1 to n do begin inc(temp,noi); if temp>best then best:=temp; if temp<0 then temp:=0; end;它的一维改版有:求K大子段和、游览街区(NOI97),最大子矩阵和等。二维的有:条件约束的最大子矩阵和奶牛浴场(WC2002)等题目6、游戏模型 这类题的阶段(一般是时间)和决策(一般就是游戏目标)很清楚,因此比较容易想到。典型题目:免费馅饼(NOI98)、Help Jimmy(CEOI2000)、瑰丽华尔兹(NOI2005,优化需要多费功夫)、矩阵取数游戏(NOIP2007)。7、其他模型:包括树型、状态压缩类过河、资源分配类、多次动态规划等模型典型题目有:树网的核(NOIP2007),加分二叉树(NOIP2003)、过河(NOIP2005)、机器分配(HNOI95)等在教学过程中,一般每种模型只讲1-2道题目或者甚至不讲,主要是把任务分解、布置好让学生自己独立完成,培养学生的自学能力。学生自己解决不了的就找人讨论,到各个论坛上提问,看解题报告等方法,最后才找老师。三、 提倡“一题多变”和“一题多解”,提高学生的解题能力动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。所以平时训练时,并不提倡题海战术,我们可以通过对经典试题的条件加以变化,形成“一题多变”和“一题多解”来培养学生分析问题、解决问题能力。例:数的计数(NOIP2001)【描述】我们要求找出具有下列性质数的个数(包含输入的自然数n):先输入一个自然数n(n1000),然后对此自然数按照如下方法进行处理(1)不作任何处理:(2)它的左边加上一个自然数,但该自然数不能超过原数的一半;(3)加上数后,继续按此规则进行处理,直到不能再而 自然数为止。输入:6满足条件的数为 6 (此部分不必输出)162612636136输出:6【分析】对大部分学生来讲会直接采用递归算法来求解。代码如下var n,i,k:longint;procedure sol(x:longint);var i:longint;begin inc(k); for i:=1 to x div 2 do sol(i);end;begin readln(n); k:=0; sol(n);end.如果把条件n<=1000改为n<=10000,这时候必须采用动态规划(递推)算法来完成。用fn表示最后一个数是n时,可以构造出的数的总数。规定f0=1,则显然有fn=f0+f1+.+fn div 2。代码如下:var i,j,s,n:longint; f:array1.1000of longint;begin read(n); for i:=1 to n do fi:=1; fi:=1; for i:=2 to n do for j:=1 to i div 2 do inc(fi,fj); writeln(fn);end.如果把条件n<=1000改为n<=3000000,然后直接使用递推方程,则会既TLE(超时)又MLE(超空间)。注意到右边其实是f数组开头若干个元素的和,因此可开一个s数组,用sn来存储f0至fn div 2的和。实际上,现在f数组已经不必要了,因为用s数组可写出如下状态转移方程:sn =sn-1+sn div 2(n为偶数时) 或sn =sn-1(n为奇数时)。当读入n时,输出sn div 2即可。但是这只解决了TLE的问题,MLE的问题就要考虑再加上用高精度来解决。可以用3个int64来存储一个数。这里我们看到用s数组代替f数组同样解决了MLE的问题,因为s数组的大小只有f数组的一半,题目允许的内存不能容纳f数组,却恰好可以容纳s数组。 代码如下:const Max=1000000000; D=1500000;type xNumber=array0.6 of Longint;var i,j,n:Longint; f:array0.D of xNumber; x:xNumber; t:string;begin FillChar(f,SizeOf(f),0); f0,0:=1; f0,1:=1; for i:=1 to D do begin fi:=fi-1; if not Odd(i) then begin for j:=1 to fi,0 do begin Inc(fi,j,fi div 2,j); if fi,j>=Max then begin Dec(fi,j,Max); Inc(fi,j+1,1); end; if fi,fi,0+1>0 then Inc(fi,0); end; end; end;begin Readln(n); if n<=D then begin Write(fn,fn,0); for i:=fn,0-1 downto 1 do begin Str(fn,i,t); for j:=1 to 9-Length(t) do Write(0); Write(t); end; Writeln; end else begin FillChar(x,SizeOf(x),0); x0:=1; for i:=0 to n div 2 do begin for j:=1 to x0 do begin Inc(xj,fi,j); if xj>=Max then begin Dec(xj,Max); Inc(xj+1,1); end; if (x0+1<7) and (xx0+1>0) then Inc(x0); end; end; Write(xx0); for i:=x0-1 downto 1 do begin Str(xi,t); for j:=1 to 9-Length(t) do Write(0); Write(t); end; Writeln; end; end;end.当然这道题还可以变化为:半数集问题问题描述给定一个自然数n,由n开始可以依次产生半数集set(n)中的数如下。(1) nset(n);(2) 在n的左边加上一个自然数,但该自然数不能超过最近添加的数的一半;(3) 按此规则进行处理,直到不能再添加自然数为止。例如,set(6)=6,16,26,126,36,136。半数集set(6)中有6个元素。注意半数集不是多重集。集合中已经有的元素不再添加到集合中。编程任务:对于给定的自然数n,编程计算半数集set(n)中的元素个数。(0<n<201)【分析】这是福建2005年省选题,当时很多同学都做了,可是结果都WA了。为什么呢?其实他们都当成“数的计数”问题来解决了。其实是不一样的,比如当N=24的时候可以在24前面加个12组成1224,也可以在24前面加2再加1组成1224,“半数集”把上述两种得出1224的情况当成是同一种情况,但“数的计数”是统计成两种情况。所以这道题真正的方法是采用枚举+HASH判重或者递推+局部限制。 “一题多变”和“一题多解”不但拓展了学生的解题思路、解题手段,而且能提高学生的编程能力,使学生能在联赛中做到“以不变应万变”。本文探讨至此,希望对你有所启发。从迷茫走过来的笔者,深知掌握动态规划对于刚踏上信息学竞赛辅导之路的同行来说是一件艰难的事,借此机会,笔者将自己的一些想法和大家交流一下,与大家共勉,也希望能够给参加信息学竞赛的学生一点帮助。

    注意事项

    本文(动态规划速成攻略.doc)为本站会员(李医生)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开