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\n",max); 26 } 27 return 0; 28 } 29 //TML
//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\n",len); 38 } 39 return 0; 40 } 41 //O(logN)求最长递增子序列
//AC