- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
动态规划3--最长不下降序列 - 安阳一中信息技术
动态规划程序设计(3)
由于动态规划的“名气”如此之大,以至于很多人甚至一些资料书上都往往把一种与动态规划十分相似的算法,当作是动态规划。这种算法就是递推。实际上,这两种算法还是很容易区分的。
按解题的目标来分,信息学试题主要分四类:判定性问题、构造性问题、计数问题和最优化问题。我们在竞赛中碰到的大多是最优化问题,而动态规划正是解决最优化问题的有力武器,因此动态规划在竞赛中的地位日益提高。而递推法在处理判定性问题和计数问题方面也是一把利器。下面分别就两个例子,谈一下递推法和动态规划在这两个方面的联系。
【例】1所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一起走到底层,要求找出一条路径,使路径上的值最大。
图1
这道题如果用枚举法,在数塔层数稍大的情况下(如40),则需要列举出的路径条数将是一个非常庞大的数目。所以实际求解时,可从底层开始,层层递进,最后得到最大值。n行,则有n-1个阶段,找到问题求解的最优路径。
自底向上计算:(给出递推式和终止条件)
①从底层开始,本身数即为最大数;
②倒数第二层的计算,取决于底层的数据:12+6=18,13+14=27,24+15=39,24+8=32;
③倒数第三层的计算,取决于底二层计算的数据:27+12=39,39+7=46,39+26=65
④倒数第四层的计算,取决于底三层计算的数据:46+11=57,65+8=73
⑤最后的路径:13——8——26——15——24
数据结构及算法设计
①图形转化:直角三角形,更于搜索:向下、向右
②用三维数组表示数塔:a[x,y,1]表示行、列及结点本身数据,a[x,y,2]能够取得最大值,a[x,y,3]表示前进的方向——0向下,1向右;
③算法:
数组初始化,输入每个结点值及初始的最大路径、前进方向为0;
从倒数第二层开始向上一层求最大路径,共循环N-1次;
从顶向下,输出路径:关键是J的值,由于行逐渐递增,表示向下,究竟向下还是向右取决于列的值。若J值比原先多1则向右,否则向下。
【参考程序】var
a:array[1..50,1..50,1..3] of longint;
x,y,n:integer;
begin
write( please input the number of rows:);
readln(n);
for x:=1 to n do
for y:=1 to x do
begin
read(a[x,y,1]);
a[x,y,2]:=a[x,y,1];
a[x,y,3]:=0
end;
for x:=n-1 downto 1 do
for y:=1 to x do
if a[x+1,y,2]a[x+1,y+1,2] then
begin
a[x,y,2]:=a[x,y,2]+a[x+1,y,2];
a[x,y,3]:=0
end
else
begin
a[x,y,2]:=a[x,y,2]+a[x+1,y+1,2];
a[x,y,3]:=1
end;
writeln(max=,a[1,1,2]);
y:=1;
for x:=1 to n-1 do
begin
write(a[x,y,1],- );
y:=y+a[x,y,3]
end;
writeln(a[n,y,1])
end.
输入:
5 {数塔层数}
13
11 8
12 7 26
6 14 15 8
12 7 13 24 11
输出结果:
max=86
13-8-26-15-24
例 3:求最长不下降序列
㈠问题描述:设有由 n个不相同的整数组成的数列,记为:b(1)、b(2)、……、b(n)且b(i)b(j) (ij),若存在 i1i2i3 … ie 且有 b(i1)b(i2) … b(ie)则称为长度为e的不下降序列。程序要求,当原数列给出之后,求出最长的不下降序列。
例如 13,7,9,16,38,24,37,18,44,19,21,22,63,15。例中 13,16,18,19,21,22,63 就是一个长度为 7 的不下降序列,同时也有 7 ,9,16,18,19,21,22,63长度为8的不下降序列。
㈡算法分析:根据动态规划的原理,由后往前进行搜索。
1·对 b(n)来说,由于它是最后一个数,所以当从b(n)开始查找时,只存在长度为1的不下降序列;
2·若从b(n-1)开始查找,则存在下面
文档评论(0)