以前做这种题目会用O(n^2)的方法,就是a[i] = max(a[j])+1   (j<i && x[j]<x[i]);

这道题目给的数据是n=40000,很明显这种方法要超时。。

于是加了二分,对已经搜索的过的记录下来,从而节省了时间,看代码:

View Code
1 # include<stdio.h>
2  int main()
3 {
4 int i,st,ed,L,n,a[40005],s[40005],t,mid;
5 scanf("%d",&t);
6 while(t--)
7 {
8 scanf("%d",&n);
9 for(i=1;i<=n;i++)
10 scanf("%d",&a[i]);
11 s[1]=a[1];
12 L=1;
13 for(i=2;i<=n;i++)
14 {
15 st=1;
16 ed=L+1;
17 while(st<ed)
18 {
19 mid=(st+ed)/2;
20 if(a[i]<=s[mid]) ed=mid;
21 else st=mid+1;
22 }
23 s[ed]=a[i];
24 if(ed==L+1) L++;
25 }
26 printf("%d\n",L);
27 }
28 return 0;
29 }
posted on 2011-03-30 11:00  奋斗青春  阅读(284)  评论(0编辑  收藏  举报