SlideShare a Scribd company logo
1 of 116
动态规划 (dynamic programming) 河南省实验中学 常庆卫
动态规划 dynamic programming   20 世纪 50 年代由美国数学家 Richard Bellman 发明。   是一种算法设计技术,是一种使多阶段决策过程最优的通用方法。 河南省实验中学 常庆卫
最优化原理 ,[object Object],河南省实验中学 常庆卫
无后效性 ,[object Object],河南省实验中学 常庆卫
例: ,[object Object],河南省实验中学 常庆卫
河南省实验中学 常庆卫 Dis[X]: 为城市 X 到 E 的最短路线的长度;( X 表示任意一个城市) Map[I,J]: 表示 I , J 两个城市间的距离,若 Map[I , J]=0 ,则两个城市不连通。   用深度优先搜索来做:
河南省实验中学 常庆卫 Var Se: 未访问的城市集合; Function  Long(Who: 当前访问城市 ):Integer;  求当前访问城市与城市 E 的最短距离。 Begin If Who=E Then  Long:=0  Else Begin  Min:=Maxint; For I 取遍所有城市  Do If  ( Map[Who,I]>0 )  And  (I In Se) Then Begin Se:=Se-[I]; J:=Map[Who,I]+Long(I); Se:=Se+[I]; If J<Min Then Min:=J; End; Long:=Min; End;  End;
河南省实验中学 常庆卫 Begin Se:= 除 A 外所有城市的集合; Dis[A]:=Long(A); End. 时间复杂度 :O(n!)
河南省实验中学 常庆卫 在求从 B1 到 E 的最短路径的时候,先求出从 C2 到 E 的最短路径;而在求从 B2 到 E 的最短路径的时候,又求了一遍从 C2 到 E 的最短路径。也就是说,从 C2 到 E 的最短路径我们求了两遍。同样可以发现,在求从 C1 、 C2 到 E 的最短路径的过程中,从 D1 到 E 的最短路径也被求了两遍。而在整个程序中,从 D1 到 E 的最短路径被求了四遍 .
河南省实验中学 常庆卫 求解的过程中,同时将求得的最短路径的距离 “ 记录在案 ” ,随时调用 . 由后往前 依次推出每个 Dis 值,直到推出 Dis[A] 为止。
河南省实验中学 常庆卫 我们可以用 阶段 作为每个城市的次序,然后从阶段 3 倒推至阶段 1 ,再推出 Dis[A] 。 公式: Dis[X]=Min{ Dis[Y]+Map[X,Y]} Y 是下一个阶段中与 X 相连通的城市 注:可以把 E 看成第 4 个阶段, A 看成第 0 个阶段。
河南省实验中学 常庆卫 Dis[E]=0 For  X= 阶段 3 的每个城市 Downto  阶段 0 的每个城市  Do  Begin Dis[X]:=Maxint; For  Y= 阶段 X 的下一个阶段中的每个城市  Do If  Dis[Y]+Map[X,Y]<Dis[X] Then Dis[X]:=Dis[Y]+Map[X,Y]; End. 时间复杂度 :O(n 2 )
河南省实验中学 常庆卫 有 4 个点,分别是 A 、 B 、 C 、 D ,如图所示,相邻两点用两条连线 C2k,C2k-1(1≤k≤3) 表示两条通行的道路。连线上方的数字表示道路的长度。我们定义从 A 到 D 的所有路径中,长度除以 4 所得余数最小的路径为最优路径。求一条最优路径。
[object Object],河南省实验中学 常庆卫 MOD 4 余数最小问题
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],河南省实验中学 常庆卫 分析
[object Object],河南省实验中学 常庆卫
河南省实验中学 常庆卫 让我们来换一个思路思考本题,因为本题是要求总和除以4余数最小的一条路径,我们先撇开最小余数不去管它,而是将本题改为从点 1 到点4的所有路径中,求出每条路上权值和除以4的不同余数的个数。
河南省实验中学 常庆卫 设一个数组 can[i,j] 表示从点 1 至点 i 可不可以求出一条路径是该路径的权值总和除以4的余数为 j ,那么又可以得出一个方程: can[1,0]=true  can[1,1]=false  can[1,2]=false  can[1,3]=false ans=min{k can[n,k]=true 0<=k<=3} can[i,j]= can[i-1,k] and  ((k+num[i,p]) mod 4=j)  (0<=k<=3,1<=p<=2) 通过这个方程我们可以求出从点 1 至点 i 可以达到的所有余数,我们只要从这些余数中选出一个值最小的输出就行。
[object Object],河南省实验中学 常庆卫
河南省实验中学 常庆卫 如图是一个城市道路示意图。每条边上的数字是这段道路的长度。条件:从 A 地出发,只许向右或向上走。目标:寻找一条从 A 地到 B 地的最短路径和长度。 A B 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 3 3 3 4 4 4 4 3 3 3 2 3 2 5
河南省实验中学 常庆卫 A 2 3 4 5 6 7 8 9 10 11 12 2 3 1 1 3 2 2 2 2 2 4 2 2 2 3 2 4 2 5 13 14 15 16 17 18 19 B 1 3 1 1 2 3 4 4 1 2 3 3
河南省实验中学 常庆卫 设有一个三角形的数塔,顶点结点称为根结点,每个结点有一个整数数值(小于 3000 )。从顶点出发,可以向左走,也可以向右走,可以找到一条从根结点开始到达底层的路径  问题:当三角形数塔给出后,找出一条路径,使路径上的值为最大。若这样的路径存在多条,选根部偏左的路径。 13 11 8 12 7 26 6 14 15 8 7 13 24 11 12
河南省实验中学 常庆卫 13 11 8 12 7 26 6 14 15 8 7 13 24 11 12
河南省实验中学 常庆卫 13 86 11 57 8 73 12 39 7 46 26 65 6 18 14 27 15 39 8 32 12 12 7 7 13 13 24 24 11 11
河南省实验中学 常庆卫 data[1..n,1..n] 1  2  3  4  5 1 2 3 4 5 13 11 8 12 7 26 6 14 15 8 12 7 13 24 11
河南省实验中学 常庆卫 状态 :f(i,j) 表示以第 i 行 , 第 j 列的结点为根的子树的最优值。 状态转移方程 : f(i,j)=max{f(i+1,j),f(i+1,j+1)}+data[i,j] (1<=i<n,1<=j<=i) 边界状态 : f(n,1)=data[n,1] f(n,2)=data[n,2] …… f(n,n)=data[n,n] f(n,k)=data[n,k]  (1<=k<=n)
河南省实验中学 常庆卫 f[1..n,1..n] 1  2  3  4  5 1 2 3 4 5 86 57 73 39 46 65 18 27 39 32 12 7 13 24 11
河南省实验中学 常庆卫 满二叉树有 m 层 , 叶子节点有 n 个。 则有: n=2 m 13 11 8 12 7 26 6 14 7 22 13 12 14 24 12 24 16 24 11 7 34 11 12 74 11 6 14 26 31 24 41
河南省实验中学 常庆卫 搜索策略: 时间复杂度 2 0 *2 1 *2 2 *…2 m = 2 1/m(m+1)  ≈ 2 m 2 13 81 8 12 7 26 6 14 7 22 13 12 14 24 12 24 16 24 11 7 34 11 12 74 11 6 14 26 31 24 41
河南省实验中学 常庆卫 data[1..n,1..n] 1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16   1 2 3 4 5 13 81 8 12 7 14 26 6 14 12 7 7 12 6 14 22 13 24 12 24 11 24 16 34 11 74 11 26 31 24 41
河南省实验中学 常庆卫 状态 :f(i,j) 表示以第 i 行 , 第 j 列的结点为根的子树的最优值。 状态转移方程 : f(i,j)=max{f(i+1,2*j-1),f(i+1,2*j)}+data[i,j] (1<=i<n,1<=j<=2 i-1 ) 边界状态 : f(n,1)=data[n,1] f(n,2)=data[n,2] …… f(n,n)=data[n,n] f(n,k)=data[n,k]  (1<=k<=n)
河南省实验中学 常庆卫 搜索策略: 时间复杂度 2 0 *2 1 *2 2 *…2 m = 2 1/m(m+1)  ≈ O(2 m 2 ) 动态规划: 时间复杂度 m*2 m+1   ≈ O(m*2 m ) m 是层数 , 不会很大 , 以 n 的可承受范围 , 应该在 20 以内 , 上述两个算法的时间复杂度相差不大。
动态规划的实质 ,[object Object],河南省实验中学 常庆卫
河南省实验中学 常庆卫 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
河南省实验中学 常庆卫 ,[object Object],n=1 时: ans=1 n=2 时: ans=1 7  或  n=3 时: ans=2 7  9  n=4 时: ans=3 7  9  16 状态 : f(i)  表示以第 i 个数为首项的最长不下降序列
河南省实验中学 常庆卫 1 2 3 7 8 9 10 11 12 13 14 下图  表示对于数列 m( 从第 m 项到第 n 项)以第 m 项为首项的最长不下降序列 m 14 13 … … … 12 14 13 14 11 14 13 14 阶段 0 阶段 1 阶段 2 阶段 13 … … … … … … … … … … … 阶段 14 阶段 12
河南省实验中学 常庆卫 f(i)= max f(i+1) +1  data[i]<=data[i+1] 1  data[i]>data[i+1] f(i+2) +1  data[i]<=data[i+2] 1  data[i]>data[i+2] ………… f(n-1) +1  data[i]<=data[n-1] 1  data[i]>data[n-1] f(n) +1  data[i]<=data[n] 1  data[i]>data[n]
河南省实验中学 常庆卫 设二维数组 data:array[1..n,1..3] of integer; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 13 7 9 16 38 24 37 18 44 19 21 22 63 15 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 13 7 9 16 38 24 37 18 44 19 21 22 63 15 7 8 7 6 3 4 3 5 2 4 3 2 1 1 4 3 4 8 9 7 9 10 13 11 12 13 0 0
河南省实验中学 常庆卫 初始化  data[i,1]  数列 data[i,2]  1 data[i,3]  0 输出结果 For i  n-1 down 1 do L  0;k  0; For j  i+1 to n do (data[j,1]>data[i,1])and(data[j,2]>L) Y N L  data[i,2];k  j; Y N Data[i,2]  L+1;data[i,3]  k L>0
河南省实验中学 常庆卫 正向递推方法: 状态: f(i) 表示以第 i 项为尾的数列(第 1 项到第 i 项)的最长不下降序列。
河南省实验中学 常庆卫 f(i)= max f(i-1) +1  data[i]>=data[i-1] 1  data[i]<data[i-1] f(i-2) +1  data[i] >=data[i-2] 1  data[i]<data[i-2] ………… f(2) +1  data[i] >=data[2] 1  data[i]<data[2] f(1) +1  data[i] >=data[1] 1  data[i]<data[1]
河南省实验中学 常庆卫 设二维数组 data:array[1..n,1..3] of integer; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 13 7 9 16 38 24 37 18 44 19 21 22 63 15 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 13 7 9 16 38 24 37 18 44 19 21 22 63 15 1 1 2 3 4 4 5 4 6 5 6 7 8 3 0 0 2 3 4 4 6 4 7 8 10 11 12 3
河南省实验中学 常庆卫 渡轮问题: Palmia 河在某国从东向西流过,并把该国分为南北两个部分。河的两岸各有 n 个城市,且北岸的每一个城市都与南岸的某个城市是友好城市,而且对应的关系是一一对应的。现在要求在两个友好城市之间建立一条航线,但由于天气的关系,所有航线都不能相交,因此,就不可能给所有的友好城市建立航线。 问题:当城市个数和友好关系建立之后,选择一种修建航线的方案,能建最多的航线而不相交。 1 2 3 4 5 6 7 1 2 3 4 5 7 6
小羊头啃苹果 ,[object Object],河南省实验中学 常庆卫
河南省实验中学 常庆卫 输入 第一行:包含两个整数, T 和 W 第二至 T+1 行: 1 或者 2 ,分别表示该时刻苹果从 A 树或者 B 树上掉落 输出 仅一行:小羊头所能吃到的最多的苹果数 样例输入: 7 2  2 1 1 2 2 1 1 样例输出: 6  输入输出
[object Object],[object Object],[object Object],[object Object],河南省实验中学 常庆卫
思考过程 ,[object Object],[object Object],[object Object],[object Object],[object Object],河南省实验中学 常庆卫
[object Object],[object Object],[object Object],[object Object],河南省实验中学 常庆卫
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],河南省实验中学 常庆卫
[object Object],[object Object],河南省实验中学 常庆卫
河南省实验中学 常庆卫 0  1  2  3  4  0 1 2 3 4 5 * * * 0 0 0 1 2 2 3 2 4 4 5 4 4 6 6 7 0 1 2 2 2
[object Object],[object Object],[object Object],[object Object],[object Object],河南省实验中学 常庆卫 返回
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],河南省实验中学 常庆卫 返回
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],河南省实验中学 常庆卫 返回
河南省实验中学 常庆卫 最长共公子串: 设 A , B 两个字符串,找出 A , B 中最长共公子串,可以不连续,但顺序不能颠倒。 例如: A=‘abcdefghijklmn’ B=‘kxmdyfliju’ 此时存在子串‘ km’ ,长度为 2 ‘ dfij’ ,长度为 4 但子串‘ kmdfij’ 虽然在 A , B 中都存在,但顺序不同,不是符合要求的子串。
[object Object],河南省实验中学 常庆卫 产 品 序 号 投  资 0 1 2 3 4 5 6 A 1 0 1.2 1.5 1.85 2.4 2.8 3.3 B 2 0 1.8 2.0 2.25 2.4 2.5 2.6 C 3 0 1.3 1.9 2.2 2.45 2.7 3.0
河南省实验中学 常庆卫 3,6 2,0 2,1 2,3 1,0 1,1 1,0 1,1 1,2 2,5 2,6 1,3 … 3.0 … 下图  表示对 1--X 项工程投资 Y 的最大利润 X,Y 阶段 0 阶段 1 阶段 2 2,2 2,4 2.7 2.45 2.2 1.9 1.3 0 2.25 2.0 1.8 0 1.8 0 产 品 序 号 投  资 0 1 2 3 4 5 6 A 1 0 1.2 1.5 1.85 2.4 2.8 3.3 B 2 0 1.8 2.0 2.25 2.4 2.5 2.6 C 3 0 1.3 1.9 2.2 2.45 2.7 3.0
河南省实验中学 常庆卫 f(i,j)= max{g(i,j) +f(i-1,0), g(i,j-1) +f(i-1,1) ,…, g(i,0) +f(i-1,j)} f(i,j)= max g(i,j) +f(i-1,0) g(i,j-1) +f(i-1,1) g(i,j-2) +f(i-1,2) , … , g(i,1) +f(i-1,j-1) g(i,0) +f(i-1,j)
河南省实验中学 常庆卫 0 1 2 3 4 5 6 1 0 1.2 1.5 1.85 2.4 2.8 3.3 2 0 1.8 1.2+1.83.0 1.5+1.83.3 3 0 1.8 产 品 序 号 投  资 0 1 2 3 4 5 6 A 1 0 1.2 1.5 1.85 2.4 2.8 3.3 B 2 0 1.8 2.0 2.25 2.4 2.5 2.6 C 3 0 1.3 1.9 2.2 2.45 2.7 3.0
河南省实验中学 常庆卫 最小代价子母树 设有 N 堆沙子排成一排,其编号为 1,2,3,…,N(N<=100) 。每堆沙子有一定的数量。现要将 N 堆沙子并成为一堆。归并的过程只能每次将相邻的两堆沙子堆成一堆,这样经过 N-1 次归并后成为一堆。找出一种合理的归并方法,使总的代价最小。
河南省实验中学 常庆卫 13 7 8 16 21 4 18 20 15 24 37 25 22 43 46 69 66 65 87 98 98 118 145 127 156 178 185 239
河南省实验中学 常庆卫 239=min{178,20+156, 43+118 ,87+65,145+22,185}+77 178=min{145,20+98, 43+66 ,87+25,137}+69 185=min{127,15+118, 46+65 ,98+22,156}+74 145=min{87,20+69, 43+37 ,98}+65 127=min{98,15+66, 46+25 ,98}+56 156=min{98, 24+65 ,69+22,118}+67 87=min{ 43 ,20+24,46}+44 98=min{ 46 ,15+37,69}+52 98=min{69, 24+25 ,66}+49 118=min{66, 37+22 ,65}+59 13 7 8 16 21 4 18 20 15 24 37 25 22 43 46 69 66 65 87 98 98 118 145 127 156 178 185 239
河南省实验中学 常庆卫 f(1,n)=min{f(1,n-1) , f(1,2)+f(3,n) , f(1,3)+f(4,n) , … , f(2,n)}+g(1,n) f(i,j) 表示从 i 堆沙子到 j 堆沙子的归并最小代价数。 1 2 3 4 5 6 7 1 13 20 43 87 145 178 239 2 7 15 46 98 127 185 3 8 24 69 98 156 4 16 37 66 118 5 21 25 65 6 4 22 7 18
河南省实验中学 常庆卫 f(i,j)= min{f(i,j-1), f(i,i+1)+f(i+2,j),…, f(i,j-2)+f(j-1,j), f(j+1,j)}+g(i,j) f(i,j)= min +g(i,j) f(i,j-1) f(i,i+1)+f(i+2,j) f(i,i+2)+f(i+3,j) …  … … … f(i,j-3)+f(j-2,j) f(i,j-2)+f(j-1,j) f(i+1,j)
河南省实验中学 常庆卫 f(1,n)=min{f(1,n-1) , f(1,2)+f(3,n-2) , f(1,3)+f(4,n-3) , … , f(2,n-1)}+g(1,n) f(i,j) 表示从第 i 堆沙子开始的 j 堆沙子归并最小代价数。 1 2 3 4 5 6 7 1 13 20 43 87 145 178 239 2 7 15 46 98 127 185 3 8 24 69 98 156 4 16 37 66 118 5 21 25 65 6 4 22 7 18
河南省实验中学 常庆卫 多边形游戏是单人玩的游戏。开始时,给定一个由 N 个顶点构成的多边形,每个顶点被赋予一个整数值,每条边被赋予一个算术运算符。 首次移动允许一条边删除; 接下来的每次移动,包括下面步骤 ; ( 1 )选出一条边 E ,以及边 E 所连接的顶点 V1 和 V2 ; ( 2 )用一个新的顶点 V ,来取代边 E 和顶点 V1 , V2 。其中顶点 V 的值是由顶点 V1 和 V2 的值经边的运算而得到的结果; ( 3 )游戏的目的是逐步删除所有的边,使得最后剩下一个顶点。该顶点的值便是游戏结束后的得分。 请你编写一个程序,对任意给 定的这样多边形,计算可能的最高分,并列举所有可以导致得最高分的被首次删除的边。
河南省实验中学 常庆卫 3 7 6 -3 6 -4 + + + * * *
河南省实验中学 常庆卫 3 7 6 -3 6 -4 + + * * *
河南省实验中学 常庆卫 3  *  (-4)  +  6  *  (-3)  +  6  *  7 -12 -12 2 2 -18 -18 3 3 42 42 6 -6 -6 -22 18 -12 39 21 18 -66
河南省实验中学 常庆卫 运算数: a j  ,   a j+1  ,   a j+2  ,  …  ,   a j+i-1 运算符:  b j  ,   b j+1  ,   b j+2  ,  …  ,   b j+i-2 F(i,j,1)=max{f(i-1,j,1)b j+I-2  f(1,i+j-1,1), f(i-1,j,1)b j+I-2  f(1,i+j-1,2), f(i-1,j,2)b j+I-2  f(1,i+j-1,1), f(i-1,j,2)b j+I-2  f(1,i+j-1,2), f(i-1,j,1)b j  f(1,j,1), f(i-1,j,1)b j  f(1,j,2), f(i-1,j,2)b j  f(1,j,1), f(i-1,j,2)b j  f(1,j,2),}
河南省实验中学 常庆卫 设有一个长度为 N 的数字字符串,分成 K+1 个部分,使得 K+1 个部分的乘积最大。 例如 N=6 ,且数字字符串为‘ 30143’ , K=3. 此时可能有的情况有以下各种: 3 * 1 * 0 * 143=0 3 * 1 * 01 * 43=129 3 * 1 * 014 * 3=126 3 * 10 * 1 * 43=1290 3 * 10 * 14 * 3=1260 3 * 101 * 4 * 3=3636 31 * 0 * 1 * 43=0 31 * 01 * 4 * 3=372 310 * 1 * 4 * 3=3720 问题:当 N ,数字串, K 给出之后,找出一种分法使其乘积最大。
河南省实验中学 常庆卫 设 f(i,j,s) 表示从 A i 到 A j , s 个乘号取得的最大值。 f(i,j) 表示从 A i 到 A j 的数字最大列 f(1,n,k)=max{f(1,n-1,k-1)*g(n,n), f(1,n-2,k-1)*g(n-1,n),…, f(1,k,k-1)*g(k+1,n)} 1 2 3 4 5 6 7 8 9 0 3 32 321 3210 32104 321044 3210441 32104410 321044105 1 6 63 630 12840 128416 2 6 60 2520 51360 526440 3 0 240 10080 103320 1033200 4 0 960 10080 10080 5166000
河南省实验中学 常庆卫 一个作曲家作了 n 首歌曲,标号从 1—n( 按作曲时间排列 ) ,现在要出版这位作曲家的部分歌曲,计划用 m 张碟片出版,每张碟片长度为 t, 歌曲必须按照作曲时间选曲,即第一张碟选了 1 、 3 ,第二张碟就只能从 4 开始选。问如何选曲才能使所选歌曲数量最多,最多歌曲数量是多少? 输入: n , m , t , n 首歌曲的长度 输出:最多歌曲数量
河南省实验中学 常庆卫 设一个 n 个节点的二叉树 tree 的中序遍历为( 1,2,3,…,n ),其中数字 1,2,3,…,n 为节点编号。每个节点都有一个分数(均为正整数),记第 i 个节点的分数为 di , tree 及它的每个子树都有一个加分,任一棵子树 subtree (也包含 tree 本身)的加分计算方法如下: subtree 的左子树的加分 × subtree 的右子树的加分+ subtree 的根的分数 若某个子树为空,规定其加分为 1 ,叶子的加分就是叶节点本身的分数。不考虑它的空子树。 试求一棵符合中序遍历为( 1,2,3,…,n )且加分最高的二叉树 tree 。要求输出; ( 1 ) tree 的最高加分 ( 2 ) tree 的前序遍历 加分二叉树
河南省实验中学 常庆卫 输入输出样例  tree.in 5  5 7 1 2 10     tree.out 145  3 1 2 4 5
河南省实验中学 常庆卫 动态规划 状态 : f(i,j): 表示从节点 i 到节点 j 所组成的二叉树的最大加分。
河南省实验中学 常庆卫 f(i,j)=max f(i,i)+f(i+1,j) f(i+1,i+1)+f(i,i)*f(i+2,j) f(i+2,i+2)+f(i,i+1)*f(i+3,j) ………… f(j-1,j-1)+f(i,j-2)*f(j,j) f(j,j)+f(i,j-1)
河南省实验中学 常庆卫 设一个 n 个节点的二叉树 tree 的中序遍历为( l,2,3,…,n ),其中数字 1,2,3,…,n 为节点编号。每个节点都有一个分数(均为正整数),记第 i 个节点的分数为 di , tree 及它的每个子树都有一个加分,任一棵子树 subtree (也包含 tree 本身)的加分计算方法如下: subtree 的左子树的加分 × subtree 的右子树的加分+ subtree 的根的分数 若某个子树为空,规定其加分为 1 ,叶子的加分就是叶节点本身的分数。不考虑它的空子树。 试求一棵符合中序遍历为( 1,2,3,…,n )且加分最高的二叉树 tree 。要求输出; ( 1 ) tree 的最高加分 ( 2 ) tree 的前序遍历 加分二叉树
河南省实验中学 常庆卫 输入输出样例  tree.in 5  5 7 1 2 10     tree.out 145  3 1 2 4 5
河南省实验中学 常庆卫 tree.in 5  5 7 1 2 10     tree.out 145  3 1 2 4 5  样例分析 5 1 7 2 10
河南省实验中学 常庆卫 动态规划 状态 : f(i,j): 表示从节点 i 到节点 j 所组成的二叉树的最大加分。  边界状态 : f(i,i)=data[i]
河南省实验中学 常庆卫 f(i,j)=max f(i,i)+f(i+1,j) f(i+1,i+1)+f(i,i)*f(i+2,j) f(i+2,i+2)+f(i,i+1)*f(i+3,j) ………… f(j-1,j-1)+f(i,j-2)*f(j,j) f(j,j)+f(i,j-1)
河南省实验中学 常庆卫 tree.in 5  5 7 1 2 10     tree.out 145  3 1 2 4 5  1  2  3  4  5 1 2 3 4 5 5 12 13 25 145 7 8 15 85 1 3 13 2 12 10 1 2 3 4 5 5 7 1 2 10
河南省实验中学 常庆卫 动态规划 ( 另一种策略 ) 状态 : f(i,j): 表示从节点 i 开始的 j 个节点所组成的二叉树的最大加分。  边界状态 : f(i,1)=data[i]
河南省实验中学 常庆卫 f(i,j)=max f(i,1)+f(i+1,j-1) f(i+1,1)+f(i,1)*f(i+2,j-2) f(i+2,1)+f(i,2)*f(i+3,j-3) ………… f(j-1,1)+f(i,j-2)*f(j,1) f(j,j)+f(i,j-1)
河南省实验中学 常庆卫 f(i,j)=max f(i,1)+f(i+1,j-1) f(i+1,1)+f(i,1)*f(i+2,j-2) f(i+2,1)+f(i,2)*f(i+3,j-3) ………… f(j-1,1)+f(i,j-2)*f(j,1) f(j,j)+f(i,j-1) f(i+k,1)+f(i,k)*f(i+k+1,j-k-1) …………
河南省实验中学 常庆卫 tree.in 5  5 7 1 2 10     tree.out 145  3 1 2 4 5  1  2  3  4  5 1 2 3 4 5 5 12 13 25 145 7 8 15 85 1 3 13 2 12 10 1 2 3 4 5 5 7 1 2 10
背包问题 ,[object Object],[object Object],[object Object],[object Object],[object Object],河南省实验中学 常庆卫
河南省实验中学 常庆卫 采用贪心策略来解决部分背包问题 : 先对每件物品计算其每磅价值 V i /W i   , 然后按每磅价值单调递减的顺序对所有物品排序。 例如,总共有三件物品和一个背包
河南省实验中学 常庆卫 按照一种贪心策略,窃贼开始时对具有最大的每磅价值的物品尽量多拿一些。如果他拿完了该物品后仍可以取一些其他物品时,他就再取具有次大的每磅价值的物品,一直继续下去,直到不能取为止。
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],河南省实验中学 常庆卫
由此可见,在部分背包问题中,当我们在考虑是否把一件物品加到背包中时,不需要把加入该物品的子问题解与不取该物品的子问题解加以比较。由这种贪心方式所形成的所有子问题是互相独立的。  ,[object Object],[object Object],[object Object],河南省实验中学 常庆卫 但是从左图可以看出,最优解取的是物品 2 和3,没有取物品 1 。两种包含物品 1 的可能解都不是最优解 
河南省实验中学 常庆卫 在 01 背包问题中不应取物品 1 的原因在于这样无法将背包填满,空余的空间降低了它的每磅价值,因此当我们考虑是否要把一件物品加到背包中时,必须对把加进该物品的子问题的解与不取该物品的子问题的解进行比较。由这种方式形成的子问题导致了许多重迭的子问题。对于这一类虽具有最优化结构性质、但产生的子问题互为重迭的试题,一般采用动态程序设计的方法求解。
背包问题 ,[object Object],[object Object],[object Object],[object Object],[object Object],河南省实验中学 常庆卫
河南省实验中学 常庆卫 某商店有  n  类物品,第  i  类物品价值为  P i   ,重量为  W i   ,背包最大能承受的重量为  G  。其中  P i   和  W i   和  G  都为非负整数。目标是如何选择装入背包的物品,使装入背包的物品总价值最大。每类物品可选任意数量 (可以是一部分) 放入背包。  背包问题 部分
河南省实验中学 常庆卫 部分背包问题 注意 : 式中是中括号,表示区间  其中  X i  表示:该类物品装入背包的重量与该类物品总重的比值,  X i  =0  表示没有第  i  种物品放到背包中;  X i  =1  表示将第  i  种物品全部放到背包中。 可将这个问题形式描述如下: 求 约束条件为
河南省实验中学 常庆卫 部分背包问题 注意 : 式中是中括号,表示区间  其中  X i  表示:该类物品装入背包的重量与该类物品总重的比值,  X i  =0  表示没有第  i  种物品放到背包中;  X i  =1  表示将第  i  种物品全部放到背包中。 可将这个问题形式描述如下: 求 约束条件为
河南省实验中学 常庆卫 输入输出样例  pack.in 100 5 30 10 20 50 40 65 20 30 60 40 pack.out 163
河南省实验中学 常庆卫 贪心算法   样例分析: i 1 2 3 4 5 W i 30 10 20 50 40 P i 65 20 30 60 40 P i / W i 2.1 2 1.5 1.2 1
河南省实验中学 常庆卫 procedure main; var i:longint;x,c:real; begin x:=0;c:=G;i:=1; while (w[i]<=c)and(i<=n) do begin x:=x+p[i]; c:=c-w[i]; i:=i+1; end; if i<=n then x:=x+c/w[i]*p[i]; end;
河南省实验中学 常庆卫 在 n 件物品取出若干件放在空间为 m 的背包里,每件物品的重量为 W 1 , W 2 ……W n ,与之相对应的价值为 P 1 ,P 2 ……P n 。求出获得最大价值的方案。     注意:在本题中,所有的重量值均为整数。  背包问题 0/1
河南省实验中学 常庆卫 0/1 背包问题 注意 : 式中是大括号,表示值表  其中  X i  表示:该件物品装入背包与否 X i  =0  表示没有将第  i  种物品放到背包中;  X i  =1  表示将第  i  种物品放到背包中。 可将这个问题形式描述如下: 求 约束条件为
河南省实验中学 常庆卫 输入输出样例  01bb.in 4 100  30 48 30 50  30 48 30 50 01bb.out 98
河南省实验中学 常庆卫 贪心算法   反例 01bb.in 4 100  80 48 50 50  90 48 50 50 01bb.out 100
河南省实验中学 常庆卫 搜索 产生式规则 :0 和 1 搜索树最大深度 :n 时间复杂度 :O(2 n )
河南省实验中学 常庆卫 动态规划 状态 : f(i,v): 表示前 i 件 物品放入容量为 v 的背包中获得的最大价值。  答案 : f(n,m)
河南省实验中学 常庆卫 复杂度分析 时间复杂度: O(nm) 空间复杂度: O(nm)
河南省实验中学 常庆卫 动态规划 状态 : f(i): 表示负重能力为 i 的背包和 n 种物品的背包问题中选择物品价值和的最大值。  答案 : f(n)
河南省实验中学 常庆卫 f(i)=max f(i-w[1])+v[1] ………… f(i-w[2])+v[2] 0 0 i-w[1]>=0 i-w[1]<0 i-w[2]>=0 i-w[2]<0 f(i-w[n])+v[n] 0 i-w[n]>=0 i-w[n]<0
河南省实验中学 常庆卫 在 n 件物品取出若干件放在空间为 m 的背包里,每件物品的重量为 W 1 , W 2 ……W n ,与之相对应的价值为 P 1 ,P 2 ……P n 。求出获得最大价值的方案。     注意:在本题中,所有的重量值可能为小数。  0/1 背包问题
河南省实验中学 常庆卫 搜索 产生式规则 :0 和 1 搜索树最大深度 :n 时间复杂度 :O(2 n )
河南省实验中学 常庆卫 在 n 种物品取出若干件放在空间为 m 的背包里,每件物品的重量为 W 1 , W 2 ……W n ,与之相对应的价值为 P 1 ,P 2 ……P n 。求出获得最大价值的方案。    注意:在本题中,所有的重量值为整数。  多重背包问题
河南省实验中学 常庆卫 贪心算法   反例 bbz.in 3 1800  1000  900 10  1000  890 1 bbz.out 1780
河南省实验中学 常庆卫 搜索 产生式规则 :0..int(m/w[i]) 搜索树最大深度 :n 时间复杂度 :O((int(m/w[i]))   n )
河南省实验中学 常庆卫 动态规划 状态 : f(i,j): 表示对前 i 种物品 , 背包容量为 j 时 , 选择物品价值和的最大值。  答案 : f(n,m)
河南省实验中学 常庆卫 f(i,j)=max f(i-1,j-w[i])+p[i] ………… f(i-1,j-2*w[i])+2*p[i] 0 0 j-w[i]>=0 j-w[i]<0 j-2*w[i]>=0 j-2*w[i]<0 f(i-1,j-k*w[i])+k*p[i] 0 j-k*w[i]>=0 i-k*w[i]<0

More Related Content

What's hot

What's hot (19)

Ch1
Ch1Ch1
Ch1
 
Ppt 101-119
Ppt 101-119Ppt 101-119
Ppt 101-119
 
Ch4 教學
Ch4 教學Ch4 教學
Ch4 教學
 
1.4乘法公式与因式分解
1.4乘法公式与因式分解1.4乘法公式与因式分解
1.4乘法公式与因式分解
 
Ch6 教學
Ch6 教學Ch6 教學
Ch6 教學
 
Num py basic(1) - v01
Num py   basic(1) - v01Num py   basic(1) - v01
Num py basic(1) - v01
 
Ch9 範例
Ch9 範例Ch9 範例
Ch9 範例
 
Appendix A
Appendix AAppendix A
Appendix A
 
Ch5 範例
Ch5 範例Ch5 範例
Ch5 範例
 
S100-39北市松山家商試題
S100-39北市松山家商試題S100-39北市松山家商試題
S100-39北市松山家商試題
 
Ppt 101-119
Ppt 101-119Ppt 101-119
Ppt 101-119
 
第3章 离散系统的时域分析
第3章   离散系统的时域分析第3章   离散系统的时域分析
第3章 离散系统的时域分析
 
【逆轉勝】數學學測總複習講義
【逆轉勝】數學學測總複習講義【逆轉勝】數學學測總複習講義
【逆轉勝】數學學測總複習講義
 
Ch8 教學
Ch8 教學Ch8 教學
Ch8 教學
 
資料結構平常測驗一的解答
資料結構平常測驗一的解答資料結構平常測驗一的解答
資料結構平常測驗一的解答
 
1 1
1 11 1
1 1
 
98up12
98up1298up12
98up12
 
Ppt 51-77
Ppt 51-77Ppt 51-77
Ppt 51-77
 
初學R語言的60分鐘
初學R語言的60分鐘初學R語言的60分鐘
初學R語言的60分鐘
 

Similar to Dp1007

S101-06高雄中學
S101-06高雄中學S101-06高雄中學
S101-06高雄中學yustar1026
 
財團法人大學入學考試中心基金會 113學年度學科能力測驗試題 數學B考科數學B考科
財團法人大學入學考試中心基金會 113學年度學科能力測驗試題 數學B考科數學B考科財團法人大學入學考試中心基金會 113學年度學科能力測驗試題 數學B考科數學B考科
財團法人大學入學考試中心基金會 113學年度學科能力測驗試題 數學B考科數學B考科中 央社
 
ncuma_邏輯與迴圈.pptx
ncuma_邏輯與迴圈.pptxncuma_邏輯與迴圈.pptx
ncuma_邏輯與迴圈.pptxNCU MCL
 
[ACM-ICPC] Efficient Algorithm
[ACM-ICPC] Efficient Algorithm[ACM-ICPC] Efficient Algorithm
[ACM-ICPC] Efficient AlgorithmChih-Hsuan Kuo
 
福建省福州大学2019年暑假物理竞赛夏令营-物理奥赛进阶之路:0-1+微积分初步+40张ppt.pptx
福建省福州大学2019年暑假物理竞赛夏令营-物理奥赛进阶之路:0-1+微积分初步+40张ppt.pptx福建省福州大学2019年暑假物理竞赛夏令营-物理奥赛进阶之路:0-1+微积分初步+40张ppt.pptx
福建省福州大学2019年暑假物理竞赛夏令营-物理奥赛进阶之路:0-1+微积分初步+40张ppt.pptxyantingguo2008
 
指考乙公式
指考乙公式指考乙公式
指考乙公式zoayzoay
 
ncuma_串列.pptx
ncuma_串列.pptxncuma_串列.pptx
ncuma_串列.pptxNCU MCL
 
J102-05南區聯盟試題
J102-05南區聯盟試題J102-05南區聯盟試題
J102-05南區聯盟試題yustar1026
 
S101-25全國聯招
S101-25全國聯招S101-25全國聯招
S101-25全國聯招yustar1026
 
ncuma_型別與迴圈.pptx
ncuma_型別與迴圈.pptxncuma_型別與迴圈.pptx
ncuma_型別與迴圈.pptxNCU MCL
 
项目反应理论公式20090925
项目反应理论公式20090925项目反应理论公式20090925
项目反应理论公式20090925Albert
 
第7章 语法制导翻译和中间代码生成
第7章 语法制导翻译和中间代码生成第7章 语法制导翻译和中间代码生成
第7章 语法制导翻译和中间代码生成tjpucompiler
 
108年數甲指考試題
108年數甲指考試題108年數甲指考試題
108年數甲指考試題中 央社
 
项目反应理论项目进度报告20090929
项目反应理论项目进度报告20090929项目反应理论项目进度报告20090929
项目反应理论项目进度报告20090929Albert
 
SymPy在微積分上的應用.ppt
SymPy在微積分上的應用.pptSymPy在微積分上的應用.ppt
SymPy在微積分上的應用.pptmclmath
 

Similar to Dp1007 (20)

S101-06高雄中學
S101-06高雄中學S101-06高雄中學
S101-06高雄中學
 
Ppt 26-50
Ppt 26-50Ppt 26-50
Ppt 26-50
 
Ppt 1-50
Ppt 1-50Ppt 1-50
Ppt 1-50
 
財團法人大學入學考試中心基金會 113學年度學科能力測驗試題 數學B考科數學B考科
財團法人大學入學考試中心基金會 113學年度學科能力測驗試題 數學B考科數學B考科財團法人大學入學考試中心基金會 113學年度學科能力測驗試題 數學B考科數學B考科
財團法人大學入學考試中心基金會 113學年度學科能力測驗試題 數學B考科數學B考科
 
ncuma_邏輯與迴圈.pptx
ncuma_邏輯與迴圈.pptxncuma_邏輯與迴圈.pptx
ncuma_邏輯與迴圈.pptx
 
Ppt 1-25
Ppt 1-25Ppt 1-25
Ppt 1-25
 
[ACM-ICPC] Efficient Algorithm
[ACM-ICPC] Efficient Algorithm[ACM-ICPC] Efficient Algorithm
[ACM-ICPC] Efficient Algorithm
 
福建省福州大学2019年暑假物理竞赛夏令营-物理奥赛进阶之路:0-1+微积分初步+40张ppt.pptx
福建省福州大学2019年暑假物理竞赛夏令营-物理奥赛进阶之路:0-1+微积分初步+40张ppt.pptx福建省福州大学2019年暑假物理竞赛夏令营-物理奥赛进阶之路:0-1+微积分初步+40张ppt.pptx
福建省福州大学2019年暑假物理竞赛夏令营-物理奥赛进阶之路:0-1+微积分初步+40张ppt.pptx
 
指考乙公式
指考乙公式指考乙公式
指考乙公式
 
Ppt 51-77
Ppt 51-77Ppt 51-77
Ppt 51-77
 
ncuma_串列.pptx
ncuma_串列.pptxncuma_串列.pptx
ncuma_串列.pptx
 
J102-05南區聯盟試題
J102-05南區聯盟試題J102-05南區聯盟試題
J102-05南區聯盟試題
 
Ch2
Ch2Ch2
Ch2
 
S101-25全國聯招
S101-25全國聯招S101-25全國聯招
S101-25全國聯招
 
ncuma_型別與迴圈.pptx
ncuma_型別與迴圈.pptxncuma_型別與迴圈.pptx
ncuma_型別與迴圈.pptx
 
项目反应理论公式20090925
项目反应理论公式20090925项目反应理论公式20090925
项目反应理论公式20090925
 
第7章 语法制导翻译和中间代码生成
第7章 语法制导翻译和中间代码生成第7章 语法制导翻译和中间代码生成
第7章 语法制导翻译和中间代码生成
 
108年數甲指考試題
108年數甲指考試題108年數甲指考試題
108年數甲指考試題
 
项目反应理论项目进度报告20090929
项目反应理论项目进度报告20090929项目反应理论项目进度报告20090929
项目反应理论项目进度报告20090929
 
SymPy在微積分上的應用.ppt
SymPy在微積分上的應用.pptSymPy在微積分上的應用.ppt
SymPy在微積分上的應用.ppt
 

Dp1007

  • 1. 动态规划 (dynamic programming) 河南省实验中学 常庆卫
  • 2. 动态规划 dynamic programming 20 世纪 50 年代由美国数学家 Richard Bellman 发明。 是一种算法设计技术,是一种使多阶段决策过程最优的通用方法。 河南省实验中学 常庆卫
  • 3.
  • 4.
  • 5.
  • 6. 河南省实验中学 常庆卫 Dis[X]: 为城市 X 到 E 的最短路线的长度;( X 表示任意一个城市) Map[I,J]: 表示 I , J 两个城市间的距离,若 Map[I , J]=0 ,则两个城市不连通。   用深度优先搜索来做:
  • 7. 河南省实验中学 常庆卫 Var Se: 未访问的城市集合; Function Long(Who: 当前访问城市 ):Integer; 求当前访问城市与城市 E 的最短距离。 Begin If Who=E Then Long:=0 Else Begin Min:=Maxint; For I 取遍所有城市 Do If ( Map[Who,I]>0 ) And (I In Se) Then Begin Se:=Se-[I]; J:=Map[Who,I]+Long(I); Se:=Se+[I]; If J<Min Then Min:=J; End; Long:=Min; End; End;
  • 8. 河南省实验中学 常庆卫 Begin Se:= 除 A 外所有城市的集合; Dis[A]:=Long(A); End. 时间复杂度 :O(n!)
  • 9. 河南省实验中学 常庆卫 在求从 B1 到 E 的最短路径的时候,先求出从 C2 到 E 的最短路径;而在求从 B2 到 E 的最短路径的时候,又求了一遍从 C2 到 E 的最短路径。也就是说,从 C2 到 E 的最短路径我们求了两遍。同样可以发现,在求从 C1 、 C2 到 E 的最短路径的过程中,从 D1 到 E 的最短路径也被求了两遍。而在整个程序中,从 D1 到 E 的最短路径被求了四遍 .
  • 10. 河南省实验中学 常庆卫 求解的过程中,同时将求得的最短路径的距离 “ 记录在案 ” ,随时调用 . 由后往前 依次推出每个 Dis 值,直到推出 Dis[A] 为止。
  • 11. 河南省实验中学 常庆卫 我们可以用 阶段 作为每个城市的次序,然后从阶段 3 倒推至阶段 1 ,再推出 Dis[A] 。 公式: Dis[X]=Min{ Dis[Y]+Map[X,Y]} Y 是下一个阶段中与 X 相连通的城市 注:可以把 E 看成第 4 个阶段, A 看成第 0 个阶段。
  • 12. 河南省实验中学 常庆卫 Dis[E]=0 For X= 阶段 3 的每个城市 Downto 阶段 0 的每个城市 Do Begin Dis[X]:=Maxint; For Y= 阶段 X 的下一个阶段中的每个城市 Do If Dis[Y]+Map[X,Y]<Dis[X] Then Dis[X]:=Dis[Y]+Map[X,Y]; End. 时间复杂度 :O(n 2 )
  • 13. 河南省实验中学 常庆卫 有 4 个点,分别是 A 、 B 、 C 、 D ,如图所示,相邻两点用两条连线 C2k,C2k-1(1≤k≤3) 表示两条通行的道路。连线上方的数字表示道路的长度。我们定义从 A 到 D 的所有路径中,长度除以 4 所得余数最小的路径为最优路径。求一条最优路径。
  • 14.
  • 15.
  • 16.
  • 18. 河南省实验中学 常庆卫 设一个数组 can[i,j] 表示从点 1 至点 i 可不可以求出一条路径是该路径的权值总和除以4的余数为 j ,那么又可以得出一个方程: can[1,0]=true can[1,1]=false can[1,2]=false can[1,3]=false ans=min{k can[n,k]=true 0<=k<=3} can[i,j]= can[i-1,k] and ((k+num[i,p]) mod 4=j) (0<=k<=3,1<=p<=2) 通过这个方程我们可以求出从点 1 至点 i 可以达到的所有余数,我们只要从这些余数中选出一个值最小的输出就行。
  • 19.
  • 20. 河南省实验中学 常庆卫 如图是一个城市道路示意图。每条边上的数字是这段道路的长度。条件:从 A 地出发,只许向右或向上走。目标:寻找一条从 A 地到 B 地的最短路径和长度。 A B 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 3 3 3 4 4 4 4 3 3 3 2 3 2 5
  • 21. 河南省实验中学 常庆卫 A 2 3 4 5 6 7 8 9 10 11 12 2 3 1 1 3 2 2 2 2 2 4 2 2 2 3 2 4 2 5 13 14 15 16 17 18 19 B 1 3 1 1 2 3 4 4 1 2 3 3
  • 22. 河南省实验中学 常庆卫 设有一个三角形的数塔,顶点结点称为根结点,每个结点有一个整数数值(小于 3000 )。从顶点出发,可以向左走,也可以向右走,可以找到一条从根结点开始到达底层的路径 问题:当三角形数塔给出后,找出一条路径,使路径上的值为最大。若这样的路径存在多条,选根部偏左的路径。 13 11 8 12 7 26 6 14 15 8 7 13 24 11 12
  • 23. 河南省实验中学 常庆卫 13 11 8 12 7 26 6 14 15 8 7 13 24 11 12
  • 24. 河南省实验中学 常庆卫 13 86 11 57 8 73 12 39 7 46 26 65 6 18 14 27 15 39 8 32 12 12 7 7 13 13 24 24 11 11
  • 25. 河南省实验中学 常庆卫 data[1..n,1..n] 1 2 3 4 5 1 2 3 4 5 13 11 8 12 7 26 6 14 15 8 12 7 13 24 11
  • 26. 河南省实验中学 常庆卫 状态 :f(i,j) 表示以第 i 行 , 第 j 列的结点为根的子树的最优值。 状态转移方程 : f(i,j)=max{f(i+1,j),f(i+1,j+1)}+data[i,j] (1<=i<n,1<=j<=i) 边界状态 : f(n,1)=data[n,1] f(n,2)=data[n,2] …… f(n,n)=data[n,n] f(n,k)=data[n,k] (1<=k<=n)
  • 27. 河南省实验中学 常庆卫 f[1..n,1..n] 1 2 3 4 5 1 2 3 4 5 86 57 73 39 46 65 18 27 39 32 12 7 13 24 11
  • 28. 河南省实验中学 常庆卫 满二叉树有 m 层 , 叶子节点有 n 个。 则有: n=2 m 13 11 8 12 7 26 6 14 7 22 13 12 14 24 12 24 16 24 11 7 34 11 12 74 11 6 14 26 31 24 41
  • 29. 河南省实验中学 常庆卫 搜索策略: 时间复杂度 2 0 *2 1 *2 2 *…2 m = 2 1/m(m+1) ≈ 2 m 2 13 81 8 12 7 26 6 14 7 22 13 12 14 24 12 24 16 24 11 7 34 11 12 74 11 6 14 26 31 24 41
  • 30. 河南省实验中学 常庆卫 data[1..n,1..n] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 13 81 8 12 7 14 26 6 14 12 7 7 12 6 14 22 13 24 12 24 11 24 16 34 11 74 11 26 31 24 41
  • 31. 河南省实验中学 常庆卫 状态 :f(i,j) 表示以第 i 行 , 第 j 列的结点为根的子树的最优值。 状态转移方程 : f(i,j)=max{f(i+1,2*j-1),f(i+1,2*j)}+data[i,j] (1<=i<n,1<=j<=2 i-1 ) 边界状态 : f(n,1)=data[n,1] f(n,2)=data[n,2] …… f(n,n)=data[n,n] f(n,k)=data[n,k] (1<=k<=n)
  • 32. 河南省实验中学 常庆卫 搜索策略: 时间复杂度 2 0 *2 1 *2 2 *…2 m = 2 1/m(m+1) ≈ O(2 m 2 ) 动态规划: 时间复杂度 m*2 m+1 ≈ O(m*2 m ) m 是层数 , 不会很大 , 以 n 的可承受范围 , 应该在 20 以内 , 上述两个算法的时间复杂度相差不大。
  • 33.
  • 34.
  • 35.
  • 36. 河南省实验中学 常庆卫 1 2 3 7 8 9 10 11 12 13 14 下图 表示对于数列 m( 从第 m 项到第 n 项)以第 m 项为首项的最长不下降序列 m 14 13 … … … 12 14 13 14 11 14 13 14 阶段 0 阶段 1 阶段 2 阶段 13 … … … … … … … … … … … 阶段 14 阶段 12
  • 37. 河南省实验中学 常庆卫 f(i)= max f(i+1) +1 data[i]<=data[i+1] 1 data[i]>data[i+1] f(i+2) +1 data[i]<=data[i+2] 1 data[i]>data[i+2] ………… f(n-1) +1 data[i]<=data[n-1] 1 data[i]>data[n-1] f(n) +1 data[i]<=data[n] 1 data[i]>data[n]
  • 38. 河南省实验中学 常庆卫 设二维数组 data:array[1..n,1..3] of integer; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 13 7 9 16 38 24 37 18 44 19 21 22 63 15 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 13 7 9 16 38 24 37 18 44 19 21 22 63 15 7 8 7 6 3 4 3 5 2 4 3 2 1 1 4 3 4 8 9 7 9 10 13 11 12 13 0 0
  • 39. 河南省实验中学 常庆卫 初始化 data[i,1]  数列 data[i,2]  1 data[i,3]  0 输出结果 For i  n-1 down 1 do L  0;k  0; For j  i+1 to n do (data[j,1]>data[i,1])and(data[j,2]>L) Y N L  data[i,2];k  j; Y N Data[i,2]  L+1;data[i,3]  k L>0
  • 40. 河南省实验中学 常庆卫 正向递推方法: 状态: f(i) 表示以第 i 项为尾的数列(第 1 项到第 i 项)的最长不下降序列。
  • 41. 河南省实验中学 常庆卫 f(i)= max f(i-1) +1 data[i]>=data[i-1] 1 data[i]<data[i-1] f(i-2) +1 data[i] >=data[i-2] 1 data[i]<data[i-2] ………… f(2) +1 data[i] >=data[2] 1 data[i]<data[2] f(1) +1 data[i] >=data[1] 1 data[i]<data[1]
  • 42. 河南省实验中学 常庆卫 设二维数组 data:array[1..n,1..3] of integer; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 13 7 9 16 38 24 37 18 44 19 21 22 63 15 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 13 7 9 16 38 24 37 18 44 19 21 22 63 15 1 1 2 3 4 4 5 4 6 5 6 7 8 3 0 0 2 3 4 4 6 4 7 8 10 11 12 3
  • 43. 河南省实验中学 常庆卫 渡轮问题: Palmia 河在某国从东向西流过,并把该国分为南北两个部分。河的两岸各有 n 个城市,且北岸的每一个城市都与南岸的某个城市是友好城市,而且对应的关系是一一对应的。现在要求在两个友好城市之间建立一条航线,但由于天气的关系,所有航线都不能相交,因此,就不可能给所有的友好城市建立航线。 问题:当城市个数和友好关系建立之后,选择一种修建航线的方案,能建最多的航线而不相交。 1 2 3 4 5 6 7 1 2 3 4 5 7 6
  • 44.
  • 45. 河南省实验中学 常庆卫 输入 第一行:包含两个整数, T 和 W 第二至 T+1 行: 1 或者 2 ,分别表示该时刻苹果从 A 树或者 B 树上掉落 输出 仅一行:小羊头所能吃到的最多的苹果数 样例输入: 7 2 2 1 1 2 2 1 1 样例输出: 6 输入输出
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51. 河南省实验中学 常庆卫 0 1 2 3 4 0 1 2 3 4 5 * * * 0 0 0 1 2 2 3 2 4 4 5 4 4 6 6 7 0 1 2 2 2
  • 52.
  • 53.
  • 54.
  • 55. 河南省实验中学 常庆卫 最长共公子串: 设 A , B 两个字符串,找出 A , B 中最长共公子串,可以不连续,但顺序不能颠倒。 例如: A=‘abcdefghijklmn’ B=‘kxmdyfliju’ 此时存在子串‘ km’ ,长度为 2 ‘ dfij’ ,长度为 4 但子串‘ kmdfij’ 虽然在 A , B 中都存在,但顺序不同,不是符合要求的子串。
  • 56.
  • 57. 河南省实验中学 常庆卫 3,6 2,0 2,1 2,3 1,0 1,1 1,0 1,1 1,2 2,5 2,6 1,3 … 3.0 … 下图 表示对 1--X 项工程投资 Y 的最大利润 X,Y 阶段 0 阶段 1 阶段 2 2,2 2,4 2.7 2.45 2.2 1.9 1.3 0 2.25 2.0 1.8 0 1.8 0 产 品 序 号 投 资 0 1 2 3 4 5 6 A 1 0 1.2 1.5 1.85 2.4 2.8 3.3 B 2 0 1.8 2.0 2.25 2.4 2.5 2.6 C 3 0 1.3 1.9 2.2 2.45 2.7 3.0
  • 58. 河南省实验中学 常庆卫 f(i,j)= max{g(i,j) +f(i-1,0), g(i,j-1) +f(i-1,1) ,…, g(i,0) +f(i-1,j)} f(i,j)= max g(i,j) +f(i-1,0) g(i,j-1) +f(i-1,1) g(i,j-2) +f(i-1,2) , … , g(i,1) +f(i-1,j-1) g(i,0) +f(i-1,j)
  • 59. 河南省实验中学 常庆卫 0 1 2 3 4 5 6 1 0 1.2 1.5 1.85 2.4 2.8 3.3 2 0 1.8 1.2+1.83.0 1.5+1.83.3 3 0 1.8 产 品 序 号 投 资 0 1 2 3 4 5 6 A 1 0 1.2 1.5 1.85 2.4 2.8 3.3 B 2 0 1.8 2.0 2.25 2.4 2.5 2.6 C 3 0 1.3 1.9 2.2 2.45 2.7 3.0
  • 60. 河南省实验中学 常庆卫 最小代价子母树 设有 N 堆沙子排成一排,其编号为 1,2,3,…,N(N<=100) 。每堆沙子有一定的数量。现要将 N 堆沙子并成为一堆。归并的过程只能每次将相邻的两堆沙子堆成一堆,这样经过 N-1 次归并后成为一堆。找出一种合理的归并方法,使总的代价最小。
  • 61. 河南省实验中学 常庆卫 13 7 8 16 21 4 18 20 15 24 37 25 22 43 46 69 66 65 87 98 98 118 145 127 156 178 185 239
  • 62. 河南省实验中学 常庆卫 239=min{178,20+156, 43+118 ,87+65,145+22,185}+77 178=min{145,20+98, 43+66 ,87+25,137}+69 185=min{127,15+118, 46+65 ,98+22,156}+74 145=min{87,20+69, 43+37 ,98}+65 127=min{98,15+66, 46+25 ,98}+56 156=min{98, 24+65 ,69+22,118}+67 87=min{ 43 ,20+24,46}+44 98=min{ 46 ,15+37,69}+52 98=min{69, 24+25 ,66}+49 118=min{66, 37+22 ,65}+59 13 7 8 16 21 4 18 20 15 24 37 25 22 43 46 69 66 65 87 98 98 118 145 127 156 178 185 239
  • 63. 河南省实验中学 常庆卫 f(1,n)=min{f(1,n-1) , f(1,2)+f(3,n) , f(1,3)+f(4,n) , … , f(2,n)}+g(1,n) f(i,j) 表示从 i 堆沙子到 j 堆沙子的归并最小代价数。 1 2 3 4 5 6 7 1 13 20 43 87 145 178 239 2 7 15 46 98 127 185 3 8 24 69 98 156 4 16 37 66 118 5 21 25 65 6 4 22 7 18
  • 64. 河南省实验中学 常庆卫 f(i,j)= min{f(i,j-1), f(i,i+1)+f(i+2,j),…, f(i,j-2)+f(j-1,j), f(j+1,j)}+g(i,j) f(i,j)= min +g(i,j) f(i,j-1) f(i,i+1)+f(i+2,j) f(i,i+2)+f(i+3,j) … … … … f(i,j-3)+f(j-2,j) f(i,j-2)+f(j-1,j) f(i+1,j)
  • 65. 河南省实验中学 常庆卫 f(1,n)=min{f(1,n-1) , f(1,2)+f(3,n-2) , f(1,3)+f(4,n-3) , … , f(2,n-1)}+g(1,n) f(i,j) 表示从第 i 堆沙子开始的 j 堆沙子归并最小代价数。 1 2 3 4 5 6 7 1 13 20 43 87 145 178 239 2 7 15 46 98 127 185 3 8 24 69 98 156 4 16 37 66 118 5 21 25 65 6 4 22 7 18
  • 66. 河南省实验中学 常庆卫 多边形游戏是单人玩的游戏。开始时,给定一个由 N 个顶点构成的多边形,每个顶点被赋予一个整数值,每条边被赋予一个算术运算符。 首次移动允许一条边删除; 接下来的每次移动,包括下面步骤 ; ( 1 )选出一条边 E ,以及边 E 所连接的顶点 V1 和 V2 ; ( 2 )用一个新的顶点 V ,来取代边 E 和顶点 V1 , V2 。其中顶点 V 的值是由顶点 V1 和 V2 的值经边的运算而得到的结果; ( 3 )游戏的目的是逐步删除所有的边,使得最后剩下一个顶点。该顶点的值便是游戏结束后的得分。 请你编写一个程序,对任意给 定的这样多边形,计算可能的最高分,并列举所有可以导致得最高分的被首次删除的边。
  • 67. 河南省实验中学 常庆卫 3 7 6 -3 6 -4 + + + * * *
  • 68. 河南省实验中学 常庆卫 3 7 6 -3 6 -4 + + * * *
  • 69. 河南省实验中学 常庆卫 3 * (-4) + 6 * (-3) + 6 * 7 -12 -12 2 2 -18 -18 3 3 42 42 6 -6 -6 -22 18 -12 39 21 18 -66
  • 70. 河南省实验中学 常庆卫 运算数: a j , a j+1 , a j+2 , … , a j+i-1 运算符: b j , b j+1 , b j+2 , … , b j+i-2 F(i,j,1)=max{f(i-1,j,1)b j+I-2 f(1,i+j-1,1), f(i-1,j,1)b j+I-2 f(1,i+j-1,2), f(i-1,j,2)b j+I-2 f(1,i+j-1,1), f(i-1,j,2)b j+I-2 f(1,i+j-1,2), f(i-1,j,1)b j f(1,j,1), f(i-1,j,1)b j f(1,j,2), f(i-1,j,2)b j f(1,j,1), f(i-1,j,2)b j f(1,j,2),}
  • 71. 河南省实验中学 常庆卫 设有一个长度为 N 的数字字符串,分成 K+1 个部分,使得 K+1 个部分的乘积最大。 例如 N=6 ,且数字字符串为‘ 30143’ , K=3. 此时可能有的情况有以下各种: 3 * 1 * 0 * 143=0 3 * 1 * 01 * 43=129 3 * 1 * 014 * 3=126 3 * 10 * 1 * 43=1290 3 * 10 * 14 * 3=1260 3 * 101 * 4 * 3=3636 31 * 0 * 1 * 43=0 31 * 01 * 4 * 3=372 310 * 1 * 4 * 3=3720 问题:当 N ,数字串, K 给出之后,找出一种分法使其乘积最大。
  • 72. 河南省实验中学 常庆卫 设 f(i,j,s) 表示从 A i 到 A j , s 个乘号取得的最大值。 f(i,j) 表示从 A i 到 A j 的数字最大列 f(1,n,k)=max{f(1,n-1,k-1)*g(n,n), f(1,n-2,k-1)*g(n-1,n),…, f(1,k,k-1)*g(k+1,n)} 1 2 3 4 5 6 7 8 9 0 3 32 321 3210 32104 321044 3210441 32104410 321044105 1 6 63 630 12840 128416 2 6 60 2520 51360 526440 3 0 240 10080 103320 1033200 4 0 960 10080 10080 5166000
  • 73. 河南省实验中学 常庆卫 一个作曲家作了 n 首歌曲,标号从 1—n( 按作曲时间排列 ) ,现在要出版这位作曲家的部分歌曲,计划用 m 张碟片出版,每张碟片长度为 t, 歌曲必须按照作曲时间选曲,即第一张碟选了 1 、 3 ,第二张碟就只能从 4 开始选。问如何选曲才能使所选歌曲数量最多,最多歌曲数量是多少? 输入: n , m , t , n 首歌曲的长度 输出:最多歌曲数量
  • 74. 河南省实验中学 常庆卫 设一个 n 个节点的二叉树 tree 的中序遍历为( 1,2,3,…,n ),其中数字 1,2,3,…,n 为节点编号。每个节点都有一个分数(均为正整数),记第 i 个节点的分数为 di , tree 及它的每个子树都有一个加分,任一棵子树 subtree (也包含 tree 本身)的加分计算方法如下: subtree 的左子树的加分 × subtree 的右子树的加分+ subtree 的根的分数 若某个子树为空,规定其加分为 1 ,叶子的加分就是叶节点本身的分数。不考虑它的空子树。 试求一棵符合中序遍历为( 1,2,3,…,n )且加分最高的二叉树 tree 。要求输出; ( 1 ) tree 的最高加分 ( 2 ) tree 的前序遍历 加分二叉树
  • 75. 河南省实验中学 常庆卫 输入输出样例 tree.in 5 5 7 1 2 10   tree.out 145 3 1 2 4 5
  • 76. 河南省实验中学 常庆卫 动态规划 状态 : f(i,j): 表示从节点 i 到节点 j 所组成的二叉树的最大加分。
  • 77. 河南省实验中学 常庆卫 f(i,j)=max f(i,i)+f(i+1,j) f(i+1,i+1)+f(i,i)*f(i+2,j) f(i+2,i+2)+f(i,i+1)*f(i+3,j) ………… f(j-1,j-1)+f(i,j-2)*f(j,j) f(j,j)+f(i,j-1)
  • 78. 河南省实验中学 常庆卫 设一个 n 个节点的二叉树 tree 的中序遍历为( l,2,3,…,n ),其中数字 1,2,3,…,n 为节点编号。每个节点都有一个分数(均为正整数),记第 i 个节点的分数为 di , tree 及它的每个子树都有一个加分,任一棵子树 subtree (也包含 tree 本身)的加分计算方法如下: subtree 的左子树的加分 × subtree 的右子树的加分+ subtree 的根的分数 若某个子树为空,规定其加分为 1 ,叶子的加分就是叶节点本身的分数。不考虑它的空子树。 试求一棵符合中序遍历为( 1,2,3,…,n )且加分最高的二叉树 tree 。要求输出; ( 1 ) tree 的最高加分 ( 2 ) tree 的前序遍历 加分二叉树
  • 79. 河南省实验中学 常庆卫 输入输出样例 tree.in 5 5 7 1 2 10   tree.out 145 3 1 2 4 5
  • 80. 河南省实验中学 常庆卫 tree.in 5 5 7 1 2 10   tree.out 145 3 1 2 4 5 样例分析 5 1 7 2 10
  • 81. 河南省实验中学 常庆卫 动态规划 状态 : f(i,j): 表示从节点 i 到节点 j 所组成的二叉树的最大加分。 边界状态 : f(i,i)=data[i]
  • 82. 河南省实验中学 常庆卫 f(i,j)=max f(i,i)+f(i+1,j) f(i+1,i+1)+f(i,i)*f(i+2,j) f(i+2,i+2)+f(i,i+1)*f(i+3,j) ………… f(j-1,j-1)+f(i,j-2)*f(j,j) f(j,j)+f(i,j-1)
  • 83. 河南省实验中学 常庆卫 tree.in 5 5 7 1 2 10   tree.out 145 3 1 2 4 5 1 2 3 4 5 1 2 3 4 5 5 12 13 25 145 7 8 15 85 1 3 13 2 12 10 1 2 3 4 5 5 7 1 2 10
  • 84. 河南省实验中学 常庆卫 动态规划 ( 另一种策略 ) 状态 : f(i,j): 表示从节点 i 开始的 j 个节点所组成的二叉树的最大加分。 边界状态 : f(i,1)=data[i]
  • 85. 河南省实验中学 常庆卫 f(i,j)=max f(i,1)+f(i+1,j-1) f(i+1,1)+f(i,1)*f(i+2,j-2) f(i+2,1)+f(i,2)*f(i+3,j-3) ………… f(j-1,1)+f(i,j-2)*f(j,1) f(j,j)+f(i,j-1)
  • 86. 河南省实验中学 常庆卫 f(i,j)=max f(i,1)+f(i+1,j-1) f(i+1,1)+f(i,1)*f(i+2,j-2) f(i+2,1)+f(i,2)*f(i+3,j-3) ………… f(j-1,1)+f(i,j-2)*f(j,1) f(j,j)+f(i,j-1) f(i+k,1)+f(i,k)*f(i+k+1,j-k-1) …………
  • 87. 河南省实验中学 常庆卫 tree.in 5 5 7 1 2 10   tree.out 145 3 1 2 4 5 1 2 3 4 5 1 2 3 4 5 5 12 13 25 145 7 8 15 85 1 3 13 2 12 10 1 2 3 4 5 5 7 1 2 10
  • 88.
  • 89. 河南省实验中学 常庆卫 采用贪心策略来解决部分背包问题 : 先对每件物品计算其每磅价值 V i /W i , 然后按每磅价值单调递减的顺序对所有物品排序。 例如,总共有三件物品和一个背包
  • 91.
  • 92.
  • 93. 河南省实验中学 常庆卫 在 01 背包问题中不应取物品 1 的原因在于这样无法将背包填满,空余的空间降低了它的每磅价值,因此当我们考虑是否要把一件物品加到背包中时,必须对把加进该物品的子问题的解与不取该物品的子问题的解进行比较。由这种方式形成的子问题导致了许多重迭的子问题。对于这一类虽具有最优化结构性质、但产生的子问题互为重迭的试题,一般采用动态程序设计的方法求解。
  • 94.
  • 95. 河南省实验中学 常庆卫 某商店有 n 类物品,第 i 类物品价值为 P i ,重量为 W i ,背包最大能承受的重量为 G 。其中 P i 和 W i 和 G 都为非负整数。目标是如何选择装入背包的物品,使装入背包的物品总价值最大。每类物品可选任意数量 (可以是一部分) 放入背包。 背包问题 部分
  • 96. 河南省实验中学 常庆卫 部分背包问题 注意 : 式中是中括号,表示区间 其中 X i 表示:该类物品装入背包的重量与该类物品总重的比值, X i =0 表示没有第 i 种物品放到背包中; X i =1 表示将第 i 种物品全部放到背包中。 可将这个问题形式描述如下: 求 约束条件为
  • 97. 河南省实验中学 常庆卫 部分背包问题 注意 : 式中是中括号,表示区间 其中 X i 表示:该类物品装入背包的重量与该类物品总重的比值, X i =0 表示没有第 i 种物品放到背包中; X i =1 表示将第 i 种物品全部放到背包中。 可将这个问题形式描述如下: 求 约束条件为
  • 98. 河南省实验中学 常庆卫 输入输出样例 pack.in 100 5 30 10 20 50 40 65 20 30 60 40 pack.out 163
  • 99. 河南省实验中学 常庆卫 贪心算法 样例分析: i 1 2 3 4 5 W i 30 10 20 50 40 P i 65 20 30 60 40 P i / W i 2.1 2 1.5 1.2 1
  • 100. 河南省实验中学 常庆卫 procedure main; var i:longint;x,c:real; begin x:=0;c:=G;i:=1; while (w[i]<=c)and(i<=n) do begin x:=x+p[i]; c:=c-w[i]; i:=i+1; end; if i<=n then x:=x+c/w[i]*p[i]; end;
  • 101. 河南省实验中学 常庆卫 在 n 件物品取出若干件放在空间为 m 的背包里,每件物品的重量为 W 1 , W 2 ……W n ,与之相对应的价值为 P 1 ,P 2 ……P n 。求出获得最大价值的方案。    注意:在本题中,所有的重量值均为整数。 背包问题 0/1
  • 102. 河南省实验中学 常庆卫 0/1 背包问题 注意 : 式中是大括号,表示值表 其中 X i 表示:该件物品装入背包与否 X i =0 表示没有将第 i 种物品放到背包中; X i =1 表示将第 i 种物品放到背包中。 可将这个问题形式描述如下: 求 约束条件为
  • 103. 河南省实验中学 常庆卫 输入输出样例 01bb.in 4 100 30 48 30 50 30 48 30 50 01bb.out 98
  • 104. 河南省实验中学 常庆卫 贪心算法 反例 01bb.in 4 100 80 48 50 50 90 48 50 50 01bb.out 100
  • 105. 河南省实验中学 常庆卫 搜索 产生式规则 :0 和 1 搜索树最大深度 :n 时间复杂度 :O(2 n )
  • 106. 河南省实验中学 常庆卫 动态规划 状态 : f(i,v): 表示前 i 件 物品放入容量为 v 的背包中获得的最大价值。 答案 : f(n,m)
  • 107. 河南省实验中学 常庆卫 复杂度分析 时间复杂度: O(nm) 空间复杂度: O(nm)
  • 108. 河南省实验中学 常庆卫 动态规划 状态 : f(i): 表示负重能力为 i 的背包和 n 种物品的背包问题中选择物品价值和的最大值。 答案 : f(n)
  • 109. 河南省实验中学 常庆卫 f(i)=max f(i-w[1])+v[1] ………… f(i-w[2])+v[2] 0 0 i-w[1]>=0 i-w[1]<0 i-w[2]>=0 i-w[2]<0 f(i-w[n])+v[n] 0 i-w[n]>=0 i-w[n]<0
  • 110. 河南省实验中学 常庆卫 在 n 件物品取出若干件放在空间为 m 的背包里,每件物品的重量为 W 1 , W 2 ……W n ,与之相对应的价值为 P 1 ,P 2 ……P n 。求出获得最大价值的方案。    注意:在本题中,所有的重量值可能为小数。 0/1 背包问题
  • 111. 河南省实验中学 常庆卫 搜索 产生式规则 :0 和 1 搜索树最大深度 :n 时间复杂度 :O(2 n )
  • 112. 河南省实验中学 常庆卫 在 n 种物品取出若干件放在空间为 m 的背包里,每件物品的重量为 W 1 , W 2 ……W n ,与之相对应的价值为 P 1 ,P 2 ……P n 。求出获得最大价值的方案。   注意:在本题中,所有的重量值为整数。 多重背包问题
  • 113. 河南省实验中学 常庆卫 贪心算法 反例 bbz.in 3 1800 1000 900 10 1000 890 1 bbz.out 1780
  • 114. 河南省实验中学 常庆卫 搜索 产生式规则 :0..int(m/w[i]) 搜索树最大深度 :n 时间复杂度 :O((int(m/w[i])) n )
  • 115. 河南省实验中学 常庆卫 动态规划 状态 : f(i,j): 表示对前 i 种物品 , 背包容量为 j 时 , 选择物品价值和的最大值。 答案 : f(n,m)
  • 116. 河南省实验中学 常庆卫 f(i,j)=max f(i-1,j-w[i])+p[i] ………… f(i-1,j-2*w[i])+2*p[i] 0 0 j-w[i]>=0 j-w[i]<0 j-2*w[i]>=0 j-2*w[i]<0 f(i-1,j-k*w[i])+k*p[i] 0 j-k*w[i]>=0 i-k*w[i]<0

Editor's Notes