最长不下降子序列.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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[

文档评论(0)

ktj823 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档