給定一個長度為n的數列ai,求ai的子序列bi的最長長度,滿足bi&bi-1!=0(2<=i<=len)。
這道題它的(名字很。。。)思路挺巧的吧,xgc大佬秒A啊,太強了。我之後想了一會才會,也不算太難。看到這種位運算的題就應該往二進制方向去想,發現a[i]轉為二進制後隻有30位,f[i]表示目前這個數以二進制中的第i位(這個位肯定為1了)為結束的最長長度,那方程就很容易yy出來了,具體看代碼,主要還是靠&運算的特殊性質。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int a[];
int f[];
int main()
{
int n,ans=;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int wy=;
scanf("%d",&a[i]);
for(int j=;j<=;j++)
{
if((a[i]&(<<j))!=)wy=max(wy,f[j]+);
}
for(int j=;j<=;j++)
{
if((a[i]&(<<j))!=)f[j]=max(f[j],wy);
}
ans=max(ans,wy);
}
printf("%d\n",ans);
return ;
}