怎样处理呢
(O(n^2))肯定不行
不如,二进制拆分一下
这样(do_i)表示第i位为1的最长长度
对于每一个数,如果他的某一个二进制位为1,那么他可以从之前这一位为1的状态转移过来,然后转移这一位为1的状态
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int f[33];
int n;
int x;
int ans;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&x);
int k=0;
for(int j=0;j<=30;++j){
if((1<<j)&x) k=max(k,f[j]+1);
}
for(int j=0;j<=30;++j){
if((1<<j)&x) f[j]=max(k,f[j]);
}
ans=max(ans,k);
}
cout<<ans;
return 0;
}