【BZOJ4300】绝世好题(二进制,DP)

题意:

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

思路:按二进制逐位考虑,只要有至少1位取and后为1就可以接下去

设dp[i]为第i位取and之后为1的最长的序列长度,意会一下

 1 #include<cstdio>
 2 #include<iostream>
 3 typedef long long ll;
 4 using namespace std;
 5 #define MOD 1000000007
 6 #define N 110000
 7 int a[N],dp[32];
 8  
 9  
10 int main()
11 {
12     int n;
13     scanf("%d",&n);
14     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
15     for(int i=1;i<=n;i++)
16     {
17         int tmp=0;
18         for(int j=1;j<=31;j++) 
19          if(a[i]&(1<<(j-1))) tmp=max(tmp,dp[j]);
20         tmp++;
21         for(int j=1;j<=31;j++)
22          if(a[i]&(1<<(j-1))) dp[j]=max(dp[j],tmp);
23     }
24     int ans=0;
25     for(int i=1;i<=31;i++) ans=max(ans,dp[i]); 
26     printf("%d
",ans);
27     return 0;
28 }
29      
原文地址:https://www.cnblogs.com/myx12345/p/9925081.html