Description
给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len)。
solution
简单题
相与不为0,意味着有一个位置为1,所以维护含有每一个二进制位的最大长度,然后转移就枚举 (a[i]) 的所有为1的位置,取max即可
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=100005;
int a[N],n,f[N],g[N],ans=0;
void work()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
for(int j=0;j<=30;j++)
if(a[i]&(1<<j))f[i]=Max(f[i],g[j]+1);
for(int j=0;j<=30;j++)
if(a[i]&(1<<j))g[j]=Max(g[j],f[i]);
if(f[i]>ans)ans=f[i];
}
printf("%d
",ans);
}
int main()
{
work();
return 0;
}