一道还算简单的dp
n^2的想法是对于每个num[i]遍历每个数使 a&b=1这里ab是对应2进制位
但是因为要求是序列,所以是不能跳的,所以我们对于num[i]的每一位,遍历上一次他出现的位置就行了
代码
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,num[100500],nxt[40],f[100500];
inline int read()
{
int x=0;char ch=getchar();
while (ch>'9'||ch<'0') ch=getchar();
while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x;
}
signed main()
{
n=read();int ans=0;
for (int i=1;i<=n;i++) num[i]=read(),f[i]=1;
for (int i=1;i<=n;i++)
for (int k=0;k<=30;k++)
if (num[i]&(1<<k)) f[i]=max(f[i],f[nxt[k]]+1),nxt[k]=i;
for (int i=1;i<=n;i++) ans=max(ans,f[i]);
cout<<ans;
return 0;
}