还是求最长上升子序列,DP中基础的一种。不过今天出了点问题,TLE了。经过提醒,我花了N个小时去看nlogn算法,总算A了。作为一个菜鸟,还真是没有骄傲的资本啊。
1 #include2 #define MAXN 40005 3 int m,n; 4 int c[MAXN],a[MAXN]; 5 int find(int *c,int len,int n) 6 { 7 //就是在n可以取代数组c中的数的条件下, 8 //把n放到c中,n所对应的下标 9 int left=0,right=len,mid; 10 mid = (left+right)/2; 11 while(left<=right) 12 { 13 if(c[mid] < n) 14 left = mid + 1; 15 else if(c[mid] > n) 16 right = mid - 1; 17 else return mid; 18 mid = (left+right)/2; 19 } 20 return left; 21 } 22 int main() 23 { 24 int i,j,len; 25 scanf("%d",&m); 26 while(m--) 27 { 28 scanf("%d",&n); 29 for(i = 0; i < n; i++) 30 scanf("%d",&a[i]); 31 c[0] = -1; 32 c[1] = a[0]; 33 len = 1; 34 for(i = 1; i < n; i++) 35 { 36 j = find(c,len,a[i]); 37 c[j] = a[i]; 38 if(j > len) 39 len++; 40 } 41 printf("%d\n",len); 42 } 43 return 0; 44 }
代码中的注释是我的个人理解。