动态规划第6讲.ppt

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

动态程序设计 朱全民 石子合并 在一园形操场四周摆放N堆石子(N≤100),现要将石子有次序地合并成一堆.规定每次只能选相临的两堆合并成一堆,并将新的一堆的石子数,记为该次合并的得分。编一程序,由文件读入堆数N及每堆石子数(≤20), (1)选择一种合并石子的方案,使得做N-1次合并,得分的总和最少 (2) 选择一种合并石子的方案,使得做N-1次合并,得分的总和最大 输入数据: 第一行为石子堆数N; 第二行为每堆石子数,每两个数之间用一空格分隔. 输出数据 : 从第1至第N行为得分最小的合并方案. 第N+1行为空行.从N+2到2N+1行是得分最大的合并方案. 示例 动态规划 用data[i,j]表示将从第i颗石子开始的接下来j颗石子合并所得的分值, max[i,j]表示将从第i颗石子开始的接下来j颗石子合并可能的最大值,那么: max[i,j] = max(max[i, k] + max[i + k, j – k] + data[i,k] + data[i+k, j–k]) (2=k=j) max[i,i] = 0 同样的,我们用min[i,j]表示将第从第i颗石子开始的接下来j颗石子合并所得的最小值,可以得到类似的方程: min[i,j] = min(min[i, k] + min[i + k, j – k] + data[i,k] + data[i+k, j– k]) (0=k=j) min[i,i] = 0 这样,我们完美地解决了这道题。时间复杂度也是O(n2)。 多边形 多角形是一个单人玩的游戏,开始时有一个N个顶点的多边形。如图,这里N=4。每个顶点有一个整数标记,每条边上有一个“+”号或“*”号。边从1编号到N。 第一步,一条边被拿走;随后各步包括如下: 选择一条边E和连接着E的两个顶点V1和 V2; 得到一个新的顶点,标记为V1与V2通过边E上的运算符运算的结果。 最后,游戏中没有边,游戏的得分为仅剩余的一个顶点的值。 样例 分析 分析 我们在这条“线”当中继续删边,并且每次删边都使被删边两旁的点按边上的操作符合并,图五。这样进行了n-1次删边操作后,“线” 变成了一个点。我们的目的,就是安排删边的顺序,使最后的点上的数尽可能的大。 拿到题目之后,我们马上可以想到用枚举法——枚举删边的先后顺序。但边数最大可以达到50,枚举的复杂将会有50!。因此枚举算法马上被排除了。 对最优化问题的求解,我们往往可以使用动态规划来解决。这道题是不是可以使用动态规划呢? 我们先对题目进行一些变化——原题中顶点上的数可以为负数,现在我们规定这个数一定大于等于0;原题中边可以为乘号,现在我们规定只能为加号。 题意改变后,我们想到了什么?对!“石子合并”。 动态规划 我们先枚举第一次删掉的边,然后再对每种状态进行动态规划求最大值 用f(i,j)表示从j开始,进行i次删边操作所能得到的最大值,num(i)表示第i个顶点上的数,若为加法,那么: 进一步分析 最后,我们允许顶点上出现负数。以前的方程还适不适用呢? 这个例子的最优解应该是(3+2)*(-9)*(-5)=250,然而如果沿用以前的方程,得出的解将是((-10)*3+2)*(-5)=140。为什么? 我们发现,两个负数的积为正数;这两个负数越小,它们的积越大。我们从前的方程,只是尽量使得局部解最大,而从来没有想过负数的积为正数这个问题。 最终? 我们引入函数fmin和fmax来解决这个问题。fmax(i,j) 表示从j开始,进行i次删边操作所能得到的最大值,fmin(i,j) 表示从j开始,进行i次删边操作所能得到的最小值 。 完美解决 初始值 Fmax(i,i)=num(i) Fmin(i,i)=num(i) 到此为止,整个问题圆满解决了。算法的空间复杂度为O(n2),算法时间复杂度为O(n4)(先要枚举每一条边,然后再用复杂度为O(n3 )的动态规划解决)。 能量项链 在Mars星球上,每个Mars人都随身佩带着一串能量项链。在项链上有N颗能量珠。能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数。并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记。因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量。如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为(Mars单位),新产生的珠子的头标记为m,尾标记为n。 需要时,Mars人就用吸盘夹住相邻的两颗珠子,通过聚合得到能量,直到项链上只剩下一颗珠子为止。显然,不同的聚合顺序得到的总能量是不同的,请你设计一个聚合顺序,

文档评论(0)

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

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

1亿VIP精品文档

相关文档