传送门
题解:按位dp,看穿之后就是大水题。对于每一位,如果and起来为1的话就更新答案。但是之后这一步就涉及到贪心思想,对于几个数,如果有一位and起来为1的话,那么它们and起来一定不为0,所以其它按位and为1的位上也要更新dp值。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+2;
int n,x,dp[32],ans=0;
int main() {
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for (int i=1;i<=n;++i) {
int mx=0;
scanf("%d",&x);
for (int j=0;j<=30;++j)
if (x&(1<<j)) mx=max(mx,dp[j]+1);
for (int j=0;j<=30;++j)
if (x&(1<<j)) dp[j]=mx;
ans=max(ans,mx);
}
printf("%d\n",ans);
}