给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。
如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。
7 1 9 10 5 11 2 13 2 2 -1
5 1
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
nyoj_214_单调递增子序列(二)_201403182131,布布扣,bubuko.com
nyoj_214_单调递增子序列(二)_201403182131
原文:http://www.cnblogs.com/xl1027515989/p/3608815.html