bzoj 4300 绝世好题

 

4300: 绝世好题

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 2012  Solved: 1061
[Submit][Status][Discuss]

Description

给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len)。
 

 

Input

输入文件共2行。
第一行包括一个整数n。
第二行包括n个整数,第i个整数表示ai。
 

 

Output

输出文件共一行。
包括一个整数,表示子序列bi的最长长度。
 

 

Sample Input

3
1 2 3

Sample Output

2

HINT

 

n<=100000,ai<=2*10^9

 PS:今天做了个绝世好题,晚上加鸡腿?

思路:2个数要&为0,说明他们都二进制所有位置中,至少有一个为0,我们用dp[i]表示当前这个数二进制的第i位形成的最长序列

   如果当前这个数与(1<<j)&为1,说明这个数可以与前面的dp[j]为放在一个序列中,然后这个数的的二进制位置为1的位置赋值与以这个点为结束的最大序列

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 
 5 ll a[100005];
 6 int dp[50];
 7 
 8 int main(){
 9     int n;
10     scanf("%d",&n);
11     for(int i=1;i<=n;i++){
12         scanf("%lld",&a[i]);
13     }
14     int Max=0;
15     for(int i=1;i<=n;i++){
16         int tmp=0;
17         for(int j=0;j<=31;j++){
18             if(a[i]&((1LL)<<j))
19                 tmp=max(tmp,dp[j]+1);
20         }
21         for(int j=0;j<=31;j++){
22             if(a[i]&((1LL)<<j))
23                 dp[j]=tmp;
24 
25         }
26         Max=max(Max,tmp);
27     }
28     cout<<Max<<endl;
29 }

 

   

posted on 2017-07-31 15:34  hhhhx  阅读(108)  评论(0编辑  收藏  举报

导航