【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\n",ans); 27 return 0; 28 } 29
null