题目描述:传送门
题解:
用f[i]表示当前二进制i为1的最长子序列长度。
f[i]=max(f[j])+1。
代码如下:
#include<cstdio>
#include<string>
using namespace std;
const int maxn=35;
int n,ans,f[maxn];
inline int read(){
int x=0; char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while (ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x;
}
int main(){
n=read();
for (int i=1;i<=n;i++) {
int x=read(); ans=0;
for (int i=0;i<=30;i++) if (x&(1<<i)) ans=max(ans,f[i]);
for (int i=0;i<=30;i++) if (x&(1<<i)) f[i]=ans+1;
}
for (int i=0;i<=30;i++) ans=max(ans,f[i]);
printf("%d\n",ans);
return 0;
}