- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
求最长不下降序列
一.问题描述
设有由n个不相同的整数组成的数列,记为:
a(1)、a(2)、……、a(n)且a(i)a(j) (ij)
例如3,18,7,14,10,12,23,41,16,24。
若存在i1i2i3 … ie 且有a(i1)a(i2) …
a(ie)则称为长度为e的不下降序列。如上例中3,18,23,24就是一个长度为4的不下降序列,同时也有3,7,10,12,16,24长度为6的不下降序列。程序要求,当原数列给出之后,求出最长的不下降序列。
二.算法分析
(一)。根据动态规划的原理,由后往前进行搜索。
1·对a(n)来说,由于它是最后一个数,所以当从a(n)开始查找时,只存在长度为1的不下降序列;
2·若从a(n-1)开始查找,则存在下面的两种可能性:
①若a(n-1)a(n)则存在长度为2的不下降序列a(n-1),a(n)。
②若a(n-1)a(n)则存在长度为1的不下降序列a(n-1)或a(n)。
3·一般若从a(i)开始,此时最长不下降序列应该按下列方法求出:
在a(i+1),a(i+2),…,a(n)中,找出一个比a(i)大的且最长的不下降序列,作为它的后继。倒推公式为
F(I)=MAX{F(I+K)}+1
F[I]:表示以第I个位置为起点的最长不下降序列的长度。
K的选择范围:a(I+k)a(i) I+k≦n
最后从F[1]到F[N]中选取最大的即为最优解
当然也可以采用顺推的方法,顺推公式为
F(I)=MAX{F(I-K)}+1
F[I]:表示以第I个位置为终点的最长不下降序列的长度。
K的选择范围:a(I-k)a(i) I-k≧1
最后从F[1]到F[N]中选取最大的即为最优解
4·为算法上的需要,定义一个数组(倒推法)
整数类型二维数组d(N,3)
d(I,1)表示点a(i)
d(I,2)表示从I位置到达N的最长不下降序列长度
d(I,3)表示从I位置开始最长不下降序列的下一个数字的位置,以便打印。
初始化:
FOR I = 1 TO N
INPUT #1, D(I, 1)
D(I, 2) = 1
D(I, 3) = 0
NEXT I
下面给出求最长不下降序列的算法:
FOR I = N - 1 TO 1 STEP -1
L = 0: P = 0
FOR J = I + 1 TO N
IF D(I, 1) D(J, 1) AND D(J, 2) L THEN
L = D(J, 2)
P = J
END IF
NEXT J
IF L 0 THEN
D(I, 2) = L + 1
D(I, 3) = P
END IF
NEXT I
下面找出最长不下降序列:
DMAX = D(1, 2)
L = 1
FOR I = 2 TO N - 1
IF D(I, 2) DMAX THEN
DMAX = D(I, 2)
L = I {记录最长不下降序列的起点位置}
END IF
NEXT I
最长不下降序列长度为D(L, 2)
序列
WHILE L 0
PRINT D(L, 1);
L = D(L, 3)
WEND
(3)程序清单
PROGRAM MAX_RISE(INPUT,OUTPUT);
CONST MAXN=100;FNAME=Q21.TXT;
TYPE TLIST=ARRAY[1..MAXN,1..3] OF INTEGER;
VAR D:TLIST;N:BYTE;
PROCEDURE INIT;
VAR
I:INTEGER;
F:TEXT;
BEGIN
ASSIGN(F,FNAME);
RESET(F);
READLN(F,N);
FOR I:=1 TO N DO
BEGIN
READ(F,D[I,1]);
D[I,2]:=1;
D[I,3]:=0
END;
CLOSE(F);
END;
PROCEDURE MAKE;
VAR
I,J,P:BYTE;
L:INTEGER;
BEGIN
FOR I:=N-1 DOWNTO 1 DO
BEGIN
L:=0;P:=0;
FOR J:=I+1 TO N DO
IF (D[
您可能关注的文档
最近下载
- 预见性护理及早期风险识别PPT课件.pptx VIP
- 1.7 有理数的加减混合运算(分层练习).pdf VIP
- 打造“四有”体育课堂-发展学生核心素养.docx VIP
- 洋马发动机喷射泵拆卸更换调整.pptx VIP
- 2025年人工智能训练师(五级)初级资格理论考试练习题库(476题)含答案.pdf VIP
- 苏教版五年级小数的加法和减法练习题1(完美打印版).doc VIP
- 2023年上海市第二十四届初中物理竞赛(大同中学杯)初赛试卷及答案.docx
- 第5课 美丽河山我们的家 课件 人民版中华民族大家庭.pptx
- 英语人教版九年级全册Unit2 Section A教学设计.doc VIP
- 2025海康威视网络硬盘录像机(76+77+86+E系列)用户手册.docx VIP
文档评论(0)