绝世好题233。
首先类似与最长不下降子序列的O(n^2)算法来写,很简单,对吧。
之后,如何优化。。
出现了位运算,显然要按照二进制位dp。。。
&不等于0,只要有一位都为1就好了,而且,这一位一直位1。
dp转移就很好写了
#include<bits/stdc++.h>
using namespace std;
int dp[35],tmp;
int Ans;
int n,A[100001];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&A[i]);
for(int i=1;i<=n;i++)
{
tmp=0;
for(int j=0;j<=30;j++)
if((A[i]>>j)&1)tmp=max(tmp,dp[j]+1);
for(int j=0;j<=30;j++)
if((A[i]>>j)&1)dp[j]=tmp;
Ans=max(Ans,tmp);
}
cout<<Ans;
return 0;
}