最长不下降子序列的长度

 

试题描述

求最长不下降子序列的长度。 设有由n个不相同的整数组成的数列,记为:a[1]、a[2]、……、a[n]。例如:3,18,7,14,10,12,23,41,16,24。若存在0<i1<i2<i3< … < ie 且有a[i1]<=a[i2]<= … <=a[ie]则称为长度为e的不下降序列。如上例中3,18,23,24就是一个长度为4的不下降序列,同时也有3,7,10,12,16,24长度为6的不下降序列。

 
 
输入
第一行为n,表示序列中整数的个数,第二行n个数,两两之间用一个空格分隔。
输出
一个数,表示不下降子序列的最大长度(最长不下降序列数的个数)。
输入示例
5
12 22 13 6 13
输出示例
3
其他说明
数据范围:0<n<1000,其他输入数据均在int范围内。
 1 #include<iostream>
 2 using namespace std;
 3 
 4 const int MAX_N=1000;
 5 int b[MAX_N+10],aMaxLen[MAX_N+10];
 6 
 7 int main()
 8 {
 9     int i,j,N;
10     scanf("%d",&N);
11     for(i=1;i<=N;i++) scanf("%d",&b[i]);
12     aMaxLen[1]=1;
13     for(i=2;i<=N;i++) //求以第i个数为终点的最长上升子序列的长度
14     {
15         int nTmp=0;  //记录第i个数左边子序列最大长度
16         for(j=1;j<i;j++) //搜索以第i 个数左边数为终点的最长上升子序列长度
17         {
18             if(b[i]>=b[j]) //后面的数比当前大 
19             {
20                 if(nTmp<aMaxLen[j]) nTmp=aMaxLen[j]; //替换成大的 
21             }
22         }
23         aMaxLen[i]=nTmp+1;   //总会比最前面的数小 
24     }
25     int nMax=-1;
26     for(i=1;i<=N;i++)
27         if(nMax<aMaxLen[i]) nMax=aMaxLen[i];
28     printf("%d\n",nMax);
29     //system("pause");
30     return 0;
31 }
32 
33 
34 /*
35 a b c m b
36 1 2 2 2 2
37     3 3 3
38       4 1
39         1
40 ------------
41 1 2 3 4 3
42       *
43 后面的数与前面的所有数比较,大的话aMaxLen[i]+1;最后找最大。 
44 */
最长不下降子序列的长度

主要是解题方法。弄懂之后倒不难。

转载于:https://www.cnblogs.com/YXY-1211/p/4995449.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值