还是求最长上升子序列,DP中基础的一种。不过今天出了点问题,TLE了。经过提醒,我花了N个小时去看nlogn算法,总算A了。作为一个菜鸟,还真是没有骄傲的资本啊。
1 #include<stdio.h>
2 #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 }
代码中的注释是我的个人理解。