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

原文地址:https://www.cnblogs.com/xl1027515989/p/3608815.html