标签:
2 7 2 0 2 1 2 0 5 6 1 2 3 3 0 0
Case #1: 5 Case #2: 5
1 #include<cstdio> 2 #include<algorithm> 3 #define INF 0x3f3f3f3f 4 using namespace std; 5 int b[100100],g[100100]; 6 int main() 7 { 8 int t,s=0; 9 scanf("%d",&t); 10 while(t--) 11 { 12 int n,sum0=0; 13 int i,a,j; 14 scanf("%d",&n); 15 int num=0; 16 for(i = 1 ; i <= n ; i++) 17 { 18 scanf("%d",&a); 19 g[i]=INF; 20 if(a == 0) 21 { 22 sum0++; 23 continue; 24 } 25 b[++num]=a-sum0; //记录每个数都减去前面的0的数量 26 } 27 int max0=0; 28 for(i = 1 ; i <= num ; i++) 29 { 30 int k=lower_bound(g+1,g+num+1,b[i])-g; //类似二分法,把b[i]的数存到g[i]中 31 max0=max0>k?max0:k; //直接记录最长子序列长度(相当于d[i]记录以第i个数结尾的子序列的最大长度,再比较d[i]的最大值) 32 g[k]=b[i]; 33 } 34 printf("Case #%d: %d\n",++s,max0+sum0); 35 } 36 }
标签:
原文地址:http://www.cnblogs.com/yexiaozi/p/5766240.html