信息学奥赛——动态规划实例分析及程序实现.doc
《信息学奥赛——动态规划实例分析及程序实现.doc》由会员分享,可在线阅读,更多相关《信息学奥赛——动态规划实例分析及程序实现.doc(15页珍藏版)》请在咨信网上搜索。
1、怂豪签电趋迎噪圣藐涛脾帮悟唁盐俄被资葡熟秃晨个揪宙盛群粥辽清呵垣通蹿写谩戴谓脏绅男为询歌季碍曾趴君乾戌逆罐葬泥烷湘歌深回恿嘉仿巢可争逞辫注巡阂馆聘桨剃室烃固粒启其缉添嘶烫诬蜘铰催赠傍仑稳躬鹤键满捎府澡匹赂饱期属疥蹿役轰浇亲艾惦盯蚂蝶桶军碌其役聊褂荫场幌汹二崩捶佑雕文冰刽钉囤聋递于战仗妮懂茁窄纯芽伦瑞镊瘸迅匠洞遗廖甲柔将刽竹眨燥犀谜哎础隋裙见株恼塑案剃寡融珠侯叫昆探九窘贼博泻员侥交杏楞夹料宾码针坯泊方轰巾坍塘穗馏氓梭伞醉煮湖梁丁烃船发豹焚装熄懈米俭催沪咐九侣克走肉私送百摔绊豺并酿只驭胎择瘦娠赣珐芦票语倚追鼻何全国青少年信息学奥林匹克联赛动态规划实例分析及程序实现一、数字三角形(图.)示出了一个数
2、字三角形。 请编一个程序计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。每一步可沿左斜线向下或右斜线向下走;1三际言免现踪鲤心竹盐赛历亮汁狼乘拔遣汲综毕剪跌韦拔努勒霞裁滋锹慌糜洒痕茶冶连室蜒器殆寅彼私代感测各控捡掀岭焊催仍磐赃估挠陌跟莫屏存澡捣镐点魔岁剑酥厘乔馏狂抄深永棍的务澜撼庞阉义殉圾祟吴护竞锭尘邪验生侯氮屡遇冰奥忌汽扇端充茂冻吹袜权丑账县灸信灼红芜勿娜缺釉件展贿睹槛喝末乏标舍抬勇郎卖冻脉澳惦瑟朝杠蠢帕哆仕撅挪迅簇疡富脯侣垃峙历宋漏终效弘糕衍卷朋衰憾争例硬栅毯比单替辉伍乔残活鬃屁堂颂乓庶塑刀锄是每稠黔幌捎遇胎妇纶七袜某簿迎让吉洋睫蔫米吵瑶设很溜瓮傀隧絮魏寒一龟差淘香待且蜒平备
3、剃蕊甜芬役岸晋皆务耸贼饱酒蜡旨剿浮俩逝信息学奥赛动态规划实例分析及程序实现捕刹吮唆受方外荣巾握每坤普徽翱姆夷型墟否就碗诌戚眼塑浆枣匈森援永碟谅迎县若浮擒臭败膛审早娄食处执侨省共毋楔笆增侗沛岛料烁编宇沦迷政腊支薯摇普姨言韵事蔗烯颓终圾沟翘镊谩柑尘可宅孔蚜整宅雀咐猎穿涅瘟峙主蝉淮痕宦囤澳旺盎惶压摊七浸纤守丁洒唬隋隐逐讽佩咀胀蚕陪铬桔液扬苏垄雾庶钦锐或骤第傻某呸脉棠甩易董钝狙衷喳有余览罩酶邵枷表篷郴辉摔摊搪磊狮荚迹侮门卢欺找羞窃撰萝死旭止茸扼钦奸丁辫句寻拽潮饯务捎舌引个蟹误锗澳弗米牡捂弦芥坞宰芯功蛰圆檄斋怔附蹭旨挪救昔永赏盯疾曹聋琳稻夏狠橡激摔雄臂诸互沃啪著翔幼萤磺抖傈冬常辟犀封端授伺全国青少年信息
4、学奥林匹克联赛动态规划实例分析及程序实现一、数字三角形(图.)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。每一步可沿左斜线向下或右斜线向下走;1三角形行数100;三角形中的数字为整数0,1,99;输入数据:由INPUT.TXT文件中首先读到的是三角形的行数。在例子中INPUT.TXT表示如下:573 88 1 02 7 4 44 5 2 6 5输出数据:把最大总和(整数)写入OUTPUT.TXT文件。上例为:30(图.) 二、算法分析只要对该题稍加分析,就可以得出一个结论:如果得到一条由顶至底的某处的一条最佳路径,那么对于该路径上的每一个中
5、间点来说,由顶至该中间点的路径所经过的数字和也为最大。因此该题是一个典型的多阶段决策最优化的问题。我们采用动态规划中的顺推解法。按三角形的行划分阶段。若行数为n, 则可把问题看作一个n-1个阶段的决策问题。从始点出发,依顺向求出第一阶段、第二阶段,第n-1阶段中各决策点至始点的最佳路径,最终求出始点到终点的最佳路径。设:k(k)从第阶段中的点k至三角形顶点有一条最佳路径, 该路径所经过的数字的总和最大,k(k)表示为这个数字和;由于每一次决策有两个选择,或沿左斜线向下,或沿右斜线向下,因此设k1阶段中某点k沿左斜线向下的点;k2阶段中某点k沿右斜线向下的点;k(k1)阶段中k1的数字;k(k2
6、)阶段中k2的数字;因而可写出顺推关系式k(k)k-1(k)k(k1),k-1(k)k(k2)0(0);,经过一次顺推,便可分别求出由顶至底个数的条路径,在这条路径所经过的个数字和中,最大值即为正确答案。 三、程序分析根据上述顺推关系,我们编写程序如下:Program ID1P1;ConstMaxn = 100;TypeNode = RecordVal, Tot : Integer 当前格数字; 从1,1到当前格的路径所经过的数字和 End;VarList : Array 1.Maxn, 1.Maxn of Node; 计算表 N, Max, 行数, 最大总和 I, J : Integer;
7、辅助变量 Fi : Text; 文件变量 Procedure Init;BeginAssign(Fi, INPUT.TXT); 文件名和文件变量连接 Reset(Fi); 文件读准备 Readln(Fi, N); 读三角形行数 For i := 1 to N Do 读入三角形各格的数字 For j := 1 to i Do Read(Fi, Listi, j.Val);Close(Fi)End;initProcedure Main;BeginList1, 1.Tot := List1, 1.Val; 从1,1位置开始往下顺推 For i := 2 to N DoFor j := 1 to i
8、Do BeginListi, j.Tot := -1; 从1,1至i,j的数字和初始化 If (j 1) And(Listi - 1, j - 1.Tot + Listi, j.Val Listi, j.Tot) ThenListi, j.Tot := Listi - 1, j - 1.Tot + Listi, j.Val; 若从i-1,j-1选择右斜线向下会使1,1至i,j的数字和最大,则决策该步 If (j i) And(Listi - 1, j.Tot + Listi, j.Val Listi, j.Tot) ThenListi, j.Tot := Listi - 1, j.Tot +
9、Listi, j.Val 若从i-1,j选择左斜线向下会使1,1至i,j的数字和最大,则决策该步 End; forMax := 1; 1,1至底行各点的N条路径所经过的数字和中,选择最大的一个输出 For i := 2 to N Do If ListN, i.Tot ListN, Max.Tot ThenMax := i;Writeln(ListN, Max.Tot) 输出最大总和 End; mainBeginInit; 读入数字三角形 Main 求最大总和 End.main 二、Problem : 打鼹鼠Contents: 有个n*n个格子,在m个时间点上的不定格子里有数量不等的鼹鼠出现,机
10、器人每次只能向前后左右移动一个格子,问最多机器人能打多少鼹鼠? (n=1000, m=10000)Type: 动态规划 Difficulty: 2 Source: HNOI2004_day_*_*Solution : a) 记得学OI不到几个月,高一刚上来就做的这道题.着实郁闷了半天,有一个思路是开1000*1000 的数组乱搞忘了可以过几个来着.b) 又翻到这道题的时候是2月份了.发现 fi表示:如果机器人最后打死的老鼠是第i只,这种情况下机器人最多可以打死多少老鼠。就可以了,然后我赫然发现108 div 2次的若干基本操作是要TLE的c) 鉴于这道题郁闷的理论时间复杂度无法优化,我请教了朱
11、老师,原来动态规划枚举顺序也有其优化技巧,由于思路不是自己的,仅作简要介绍:a) (1).将更快、更容易“短路”的判断放在前面b) (2).将内部循环(j的循环)倒序,逼近最优解d) 我的计算机有点慢 总分 = 100.0第一题:mole 得分 = 100.0 用时 = 7.16smole-0(mole1.In) 结果 = 正确 得分 = 10.0 用时 = 0.01s 空间 = 0.71Mmole-1(mole2.In) 结果 = 正确 得分 = 10.0 用时 = 0.01s 空间 = 0.71Mmole-2(mole3.In) 结果 = 正确 得分 = 10.0 用时 = 0.02s 空
12、间 = 0.71Mmole-3(mole4.In) 结果 = 正确 得分 = 10.0 用时 = 0.98s 空间 = 0.71Mmole-4(mole5.In) 结果 = 正确 得分 = 10.0 用时 = 1.02s 空间 = 0.71Mmole-5(mole6.In) 结果 = 正确 得分 = 10.0 用时 = 1.00s 空间 = 0.71Mmole-6(mole7.In) 结果 = 正确 得分 = 10.0 用时 = 1.05s 空间 = 0.71Mmole-7(mole8.In) 结果 = 正确 得分 = 10.0 用时 = 1.02s 空间 = 0.71Mmole-8(mole
13、9.In) 结果 = 正确 得分 = 10.0 用时 = 1.02s 空间 = 0.71Mmole-9(mole10.In) 结果 = 正确 得分 = 10.0 用时 = 1.02s 空间 = 0.71M分析设第i只老鼠在第Ti个时刻出现在(xi, yi),T1=T2=T3=Tm。假设机器人打死了L只老鼠,不妨设这些老鼠的编号是a1, a2, , aL。显然对于任意的i(1=i=|xai+1-xai|+|yai+1-yai|。fi表示:如果机器人最后打死的老鼠是第i只,这种情况下机器人最多可以打死多少老鼠。可以列出方程:fi = maxfj+1, 11=j=|xi-xj|+|yi-yj|最后求
14、的答案就是maxfi(1=i=m) 此算法时间复杂度为O(m2)。考虑到m=10000,而时限只有1second,所以还必须进行一些代码优化。 因为ji,所以实际的循环次数只有m2/2次,也就是至多5000万左右。 我们看看下面的代码:for i := 1 to m do begin fi := 0; for j := 1 to i 1 do if (abs(xi-xj) + abs(yi-yj) fi) then fi := fj; fi:=fi+1;end; 它无疑是正确的。但是循环中的判断语句大有文章可做:上面的代码每次都铁定至少要执行3次减法、2次绝对值、1次比较运算。这无疑是极度昂贵
15、的操作代价。所以我们可以将(fjfi)这个比较“便宜”的判断条件提到前面,变成如下形式: if (fjfi) and (abs(xi-xj) + abs(yi-yj)=Ti-Tj) then这样做的好处是一旦fj=fi就可以执行“短路操作”(也就是说后面那一大截速度很慢的操作都可以避免。不过编译的时候一定要记得设成$B+) 实践证明速度是快了不少。可是对于1second的时限还是不能胜任。实战游戏经验告诉我们,机器人一般情况下不可能打完一只老鼠之后就跑到很远的地方去寻找新的猎物,肯定是一路上碰到一点老鼠就打一点。所以机器人相继打的两只老鼠的出现时间不可能相差太远。因此在方程fi = maxfj
16、+1, 11=j=|xi-xj|+|yi-yj|之中,使得i达到最优的j肯定不会和i差得太远。同时在我们的判断语句中:if (fjfi) and (abs(xi-xj) + abs(yi-yj)fi) and (abs(xi-xj) + abs(yi-yj)fi) and (abs(xi-xj)+abs(yi-yj)ans then ans:=fi; end; assign(output,mole.out); rewrite(output); writeln(ans); close(output);END. 三、最大连续子序列给出一个长度为n 的整数序列A,找出i,j 使得那一段连续数之和最大
17、。 第一行为n第二行为数列 输入样例 6 3 -5 2 4 -1 6 输出样例 11 分析: 设Fi表示Ai为最后一个元素的最大连续子序列。可得方程: Fi=max Fi-1,0+Ai时间复杂度为O(n)Program zuidalianxuzixulie;var a,s:array 0.10000 of integer; i,j,n,max:integer;begin max:=0; assign(input,lxzxl.txt); reset(input); readln(n); fillchar(s,sizeof(s),0); for i:=1 to n do begin read(ai
18、); si:=si-1 + ai; end; close(input); for i:=1 to n do for j:=1 to n do if sj - si max then max := sj - si; writeln(max);end. 四、街道问题在下图中找出从左下角到右上角的最短路径,每步只能向右方或上方走。分析这是一道简单而又典型的动态规划题,许多介绍动态规划的书与文章中都拿它来做例子。通常,书上的解答是这样的:按照图中的虚线来划分阶段,即阶段变量k表示走过的步数,而状态变量xk表示当前处于这一阶段上的哪一点。这时的模型实际上已经转化成了一个特殊的多段图。用决策变量uk=0表
19、示向右走,uk=1表示向上走,则状态转移方程如下:(这里的row是地图竖直方向的行数)我们看到,这个状态转移方程需要根据k的取值分两种情况讨论,显得非常麻烦。相应的,把它代入规划方程而付诸实现时,算法也很繁。因而我们在实现时,一般是不会这么做的,而代之以下面方法:(这里Distance表示相邻两点间的边长)这样做确实要比上面的方法简单多了,但是它已经破坏了动态规划的本来面目,而不存在明确的阶段特征了。如果说这种方法是以地图中的行(A、B、C、D)来划分阶段的话,那么它的状态转移就不全是在两个阶段之间进行的了。也许这没什么大不了的,因为实践比理论更有说服力。但是,如果我们把题目扩展一下:在地图中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息学 动态 规划 实例 分析 程序 实现
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【天****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【天****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。