• nyoj_214_单调递增子序列(二)_201403182131


     

    单调递增子序列(二)

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:4
     
    描述

    给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。

    如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。

     
    输入
    有多组测试数据(<=7)
    每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的下一行里有n个整数,表示数列中的所有元素.每个整形数中间用空格间隔开(0<n<=100000)。
    数据以EOF结束 。
    输入数据保证合法(全为int型整数)!
    输出
    对于每组测试数据输出整形数列的最长递增子序列的长度,每个输出占一行。
    样例输入
    7
    1 9 10 5 11 2 13
    2
    2 -1
    样例输出
    5
    1
    来源
    [521521]改编
    上传者
    ACM_赵铭浩
     
     1 #include <stdio.h>
     2 #include <string.h>
     3 int s[100010];
     4 int longest[100010];
     5 int main()
     6 {
     7     int m;
     8     while(scanf("%d",&m)!=EOF)
     9     {
    10         int i,j,max;
    11         for(i=0;i<m;i++)
    12         scanf("%d",&s[i]);
    13         for(i=0;i<m;i++)
    14         longest[i]=1;
    15         for(j=1;j<m;j++)
    16         {
    17             for(i=0;i<j;i++)
    18             if(s[j]>s[i]&&(longest[j]<longest[i]+1))
    19             longest[j]=longest[i]+1;
    20         }
    21         max=longest[0];
    22         for(i=0;i<m;i++)
    23         if(longest[i]>max)
    24         max=longest[i];
    25         printf("%d
    ",max);
    26     }
    27     return 0;
    28 }
    29 //TML
    View Code

    //TML

     1 #include <stdio.h>
     2 #include <string.h>
     3 int s[100010];
     4 int b[100010];
     5 int f(int a,int w)
     6 {
     7     int left,right,mid;
     8     left=0;right=a-1;
     9     while(left<=right)
    10     {
    11         mid=(left+right)/2;
    12         if(b[mid]>w)
    13         right=mid-1;
    14         else if(b[mid]<w)
    15         left=mid+1;
    16         else//找到了该元素,则直接返回
    17         return mid;
    18     }
    19     return left;//数组b中不存在该元素,则返回该元素应该插入的位置
    20 }
    21 int main()
    22 {
    23     int m;
    24     while(scanf("%d",&m)!=EOF)
    25     {
    26         int i,j,len;
    27         for(i=0;i<m;i++)
    28         scanf("%d",&s[i]);
    29         len=1;b[0]=s[0];
    30         for(i=1;i<m;i++)
    31         {
    32             if(s[i]>b[len-1])
    33             b[len++]=s[i];//如果大于B中最大的元素,则直接插入到B数组末尾
    34             else
    35             b[f(len,s[i])]=s[i]; //二分查找需要插入的位置
    36         }
    37         printf("%d
    ",len);
    38     }
    39     return 0;
    40 }
    41 //O(logN)求最长递增子序列 

    //AC

  • 相关阅读:
    以链表为载体学习C++(1)
    以链表为载体学习C++(2)
    20191304商苏赫Python程序设计实验一
    Python实验二 20191304商苏赫
    七大基本排序算法之插入排序
    七大基本排序算法之归并排序
    《富爸爸,穷爸爸》
    七大基本排序算法之冒泡排序
    七大基本排序算法之选择排序
    七大基本排序算法之希尔排序
  • 原文地址:https://www.cnblogs.com/xl1027515989/p/3608815.html
Copyright © 2020-2023  润新知