想了一下感觉和lis有关,交了果然AC。想不到很好的证明方法,试做证明如下:lis的每一个点都是一个不上升系统中的一员,设其为a[i],那么a[i-1]<a[i]肯定是成立的(lis的性质),夹在这两者之间的一个元素x,如果其>=a[i],那么它肯定属于a[i]这个系统,如果它小于a[i],且:1.大于a[i-1]的话,违背了lis的性质,2.<=a[i-1]的话,x属于a[i-1]这个系统。不可能有别的情况了。
归纳如下:给定一个序列,它的LIS长度就是它非上升子序列的个数。
代码如下:
1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 using namespace std; 5 const int inf = 0x3f3f3f3f; 6 const int N = 30000 + 5; 7 8 int a[N]; 9 int dp[N]; 10 11 int main() 12 { 13 int n; 14 while(scanf("%d",&n) == 1) 15 { 16 for(int i=1;i<=n;i++) scanf("%d",a+i); 17 memset(dp,inf,sizeof dp); 18 for(int i=1;i<=n;i++) 19 { 20 *lower_bound(dp+1,dp+1+n,a[i]) = a[i]; 21 } 22 printf("%d ",lower_bound(dp+1,dp+1+n,inf) - (dp+1)); 23 } 24 return 0; 25 }