用f[i]表示上一次第i位为1时的最大子序列长度
然后直接DP
读入了一个x那么我们把x的每一位为1的所对应的的f[i]都拿出来进行比较
然后做更新
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int n,f[32],x;
int a[100010];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
int now=0;
for(int j=0;j<=30;j++){
if(a[i]&(1<<j)){
now=max(f[j]+1,now);
}
}
for(int j=0;j<=30;j++){
if(a[i]&(1<<j)){
f[j]=now;
}
}
}
int ans=-1;
for(int i=0;i<=31;i++){
ans=max(ans,f[i]);
}
cout<<ans<<endl;
return 0;
}
/*
in:
3
1 2 3
out:
2
*/