• 最长不下降子序列的长度


    试题描述

    求最长不下降子序列的长度。 设有由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
    ",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 */
    最长不下降子序列的长度

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

  • 相关阅读:
    JavaScript 预解析
    JavaScript 作用域
    JavaScript 函数
    SlidesJS
    1. Skippr
    HTML5 模拟现实物理效果
    实现各种 CSS3 文本动画效果
    表单填写进度提示效果
    HTML5 WebGL 实现逼真的云朵效果
    【原创】bootstrap框架的学习 第八课 -[bootstrap表单]
  • 原文地址:https://www.cnblogs.com/YXY-1211/p/4995449.html
Copyright © 2020-2023  润新知