1、动态规划程序设计思想 -以点带面的学习方式,问题一:给定一个具有N层的数学三角形如下图,从顶至底有多条路径,每一步可沿左斜线向下或沿右斜线向下,路径所经过的数字之和为路径得分,请求出最小路径得分。,26 21 8 41 5 6 8,问题: 1、首次看到此题时用什么方法解决?,2、比较过搜索算法与动态规划算法解决问题的各自的优缺点?,3、通过此题的完成,你学到了什么?,直观分析: (1)按题意,求出每条路径的得分; (2)比较每条路径得分,求出最小路径得分。 算法实现:自顶向下递归搜索求出每条路径得分,记下当前最小路径得分,当所有的路径搜索完毕,输出最小的路径得分。,Procedure Work
2、(d,k:longint);begininc(s,ad,k);if d=n thenbeginif sMAX then MAX:=s;endelsebeginWork(d+1,k);Work(d+1,k+1);end;dec(s,ad,k);end;,换个角度分析问题:(1)求最小路径得分,即为N-1层各路径得分加上第N层数字后的最小得分;(2)如果知道第N-1层各数字位置上的最小得分值,那么第N层的各数字位上的最小得分值就很容易求得;(3)考虑第I层与第I-1层的关系,可以推出如下关系: 设AI,J表示第I层,第J列位置上的最小路径得分,则: DI,J=MIN(DI-1,J,DI-1,J-1
3、)+AI,J (4)在(1)(3)分析中,我们从第1行规划至第N行,对于本题是否可以考虑从第N行规划至第1行?,for I:=n-1 downto 1 dofor j:=1 to I dobeginif aI+1,j=aI+1,j+1 then aI,j:=aI,j+aI+1,jelse aI,j:=aI,j+aI+1,j+1;end;writeln(a1,1);,问题二:网格路线问题。给出一个N行M列(共有NM个节点)的网格,左下角坐标为(1,1),右上角坐标(N,M),从一个物体从左下角开始只能沿着向上或向右的方向前进到下一个节点(如从(1,1)只能走到(1,2)或(2,1)键盘输入N,M
4、,计算并输出从(1,1)出发,到(N,M)共有多少条路径?如图中红线就是一条路径。,于是可以得出递推公式:,讨论: 1、存贮结构; 2、问题的扩展。,问题三:有一条河从东向西将某地区分为南北2个部分。河的两岸各有N个城市。北岸的每个城市都与南岸的某个城市是友好城市,而且关系是一一对应的。现在要求在2个友好城市之间建立一条航线,但由于天气的缘故,所有的航线都不能相交,因此,就不能给所有的友好城市建立友好航线。请设计一个修建航线的方案,能建最多的航线而且不相交。 输入: 第一行为一个正整数N ( N=1000 ) 以下N行,记第i行有一个正整数j,表示北岸的城市i与南岸的城市j互为友好城市。 其中
5、城市编号是按从东到西排列的。 输出: 仅一行,即最多的航线数。,问题:此题实质上是什么问题扩展而来?,分析:首先我们需要判定对于给定的两条航线是否相交,设北岸城市i1,j1 ( i1 j1 ) 分别与南岸城市i2,j2互为友好城市,那么这两条航线不相交 ( 以下简称为i1,j1相容 ) 的充要条件是I2=J2。( 结论1 ) 由下图就可以很容易地得到这个结论。,北岸:,南岸:,图 一,图 二,问题四:在平面上有N个点,它们呈二维降序排列(所谓二维降序排列,是指同时存在x1=y2=yn)。现在需要我们在平面上沿 x,y轴方向建立一棵树,使树存在一下一些特点: 1树的枝干与x,y轴平行; 2数的叶
6、结点恰好是这N个点; 3树的总边长是指树的所有枝干的长度,我们要求它最短。 试编程找出这棵树的总长度。 问题规模:N=3000,xi,yi=20000。 输入数据:第一行为N,接下来N行为点的横坐标;最后N行为点的纵坐标。 输出数据:该树的总边长。,样例输入: 5 1 2 3 4 5 5 4 3 2 1 样例输出: 12,问题: 1、如何审题? 2、选择怎样的算法解决?时间代价多少? 3、如何优化?,状态转移方程: ak,k=0 (1=k=n) ai,j=min(ai,v+av+1,j+root_distance) (i=v=j-1) 其中的root_distance表示i至v-1构成的子树的
7、根至v+1至j构成的子树的根的距离(沿x,y轴方向),这个不难求得。根据方程,我们不难知道:一共有n2种状态,每种状态计算的时候,都需要(n)的时间,所以,一共需要(n3)的时间。而题目中规定N=3000,所以,这个算法显得很低效,必须改进。,改进算法的基本思想是:有一些点如果作为根结点,肯定得不到最优解,我们可以不去计算它们的值。具体方法是:在计算每个状态的值的时候,记录下它所选取的根结点的编号,然后我们可以将方程改进如下: ai,j=min(ai,v+av+1,j+root_distance) (si,j-1=v=si+1,j) sk,k=k (1=k=n) si,j=令ai,j取最小值时的v 这样,我们得到了一个时间为(n2)的解。这种优化思想叫做四边形不等式的思想。如石子合并等问题都可用该思想解决。,总结: 1、一个问题的求解无论其简单与否,不能仅满足于解出来,应学会从不同的角度分析与解决,类比其优劣,从一个小问题的解决掌握更多更全面的知识;,2、学会扩展问题、变化问题而提出新的问题,举一反三,培养自己创新思维的能力;,3、学会解开问题的包装,探索问题的实质,迎刃而解;,4、解决问题需要精益求精的精神,不断的钻研,刻苦的研究,大胆地提出自己的算法,也许这就是一种发明创造。,谢谢!,