zoukankan      html  css  js  c++  java
  • 最长上升子序列 题解

    最长上升子序列
    时间限制:1秒 内存限制:128M
    题目描述


    一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8).



    你的任务,就是对于给定的序列,求出最长上升子序列的长度。

    输入描述


    输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。

    输出描述


    最长上升子序列的长度。

    样例
    输入
    7
    1 7 3 5 9 4 8
    输出
    4
    提示

    另一组测试数据

    输入

    43
    486 341 527 189 740 490 388 989 489 711 174 305 844 971 492 998 954 832 442 424 619 906 154 293 395 439 735 738 915 453 748 786 550 871 932 693 326 53 904 732 835 354 364

    输出

    11 

    为了写出最长的上升序列,我们定义了len[]数组来记录每个以num[i]结尾的上升子序列的长度。初始长度设为1,如满足(num[i]>num[j]&&len[i]<len[j]+1)判断条件-------前一个数比后一个数小,并且与len[j]+1,比较大小,从而得出以num[i]结尾的最长上升子序列,并用其长度与max------及存储总最长上升子序列的比较器,比较。得出最大的max,即为正解。

    #include<iostream>
    using namespace std;
    int main()
    {
    int num[1005],len[1005];
    int max=1,n;
    cin>>n;
    int i,j;
    for(i=1;i<=n;i++)
    {
    cin>>num[i];
    }
    for(i=1;i<=n;i++)
    {
    len[i]=1;
    for(j=1;j<i;j++)
    {
    if(num[i]>num[j]&&len[i]<len[j]+1)
    {
    len[i]=len[j]+1;
    }
    }
    if(max<len[i])
    {
    max=len[i];
    }
    }
    cout<<max;
    return 0;
    }

  • 相关阅读:
    xdvipdfmx:fatal: Unable to open "xxx.pdf". Output file removed. fwrite: Broken pipe xelatex.exe
    安装Visual Studio 时窗口闪过就退出
    一些概念的收集
    如何让字符串中奇怪的空格现出原形
    mysql替换特殊字符
    asscii码对应表
    Linux下的tar压缩解压缩命令详解
    centos 6.8 /etc/sysconfig/下没有iptables的问题
    mysqldumpslow简单用法
    linux查询占用空间较大的文件
  • 原文地址:https://www.cnblogs.com/tcwbob/p/13396327.html
Copyright © 2011-2022 走看看