我是从分类上看到这个题的,所以说一开始就知道要用DP,而且是求最长上升子序列,如果直接看得是题的话可能我要读很长时间,不过 最后还是看懂 了.本来以为要用刚学的动态规划知识,没想到原来n2 的算法会超时,又要接触到一种更好的方法,O(nlogn),我看了很长时间没怎么看懂,不过多少会用了,看看这里,这个需要慢慢消化,明天接着看 ,争取弄清楚:
http://argo.sysu.edu.cn/bbsanc?path=boards/ACMICPC/D.1044598816.A/D.1044598812.A/M.1162721770.A
#include<stdio.h> int bisearch(int d[],int x,int high) { int low = 1,mid; while( low <= high ) { mid = (low + high) / 2; if( x > d[mid] && x <= d[mid + 1] ) return mid + 1; else if( x > d[mid] ) low = mid + 1; else high = mid - 1; } return mid; } int main(void) { freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); int Ncases,N,len; int i,k; int a[40010],d[40010]; while( scanf("%d",&Ncases) != EOF ) { while(Ncases--) { scanf("%d",&N); for( i = 1 ; i <= N ; i++ ) scanf("%d",&a[i]); len = 1; d[len] = a[1]; for( i = 2 ; i <= N ; i++ ) { if( a[i] > d[len] ) d[++len] = a[i]; else if( a[i] < d[len] ) { k = bisearch(d,a[i],len); d[k] = a[i]; } } printf("%d/n",len); } } return 0; }