题目大意:给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len)
题解:有显然的O(n2)lis做法
考虑转移条件为
aj
&
ai≠0,
即aj和ai
的二进制至少有一位同时为1,f[i]表示最后一个数二进制第i位为1的最优解,……于是枚举的复杂度降到了log,注意要把所有为1的二进制位更新成总最优值……因为有一位同时为1就可以了……
然后就可以
我的收获:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int n,x,temp;
int f[33];
void work()
{
int ret=0;
for(int i=0;i<=30;i++) ret=max(ret,f[i]);
printf("%d\n",ret);
}
void init()
{
scanf("%d", &n);
for(int i=1;i<=n;i++){
scanf("%d",&x);temp=0;
for(int j=0;j<=30;j++) if(x&(1<<j)) temp=max(temp,f[j]+1);
for(int j=0;j<=30;j++) if(x&(1<<j)) f[j]=max(f[j],temp);
}
}
int main()
{
init();
work();
return 0;
}