P4310 绝世好题
题目链接:https://www.luogu.com.cn/problem/P4310
题意:
给定一个数组a,求最长的子序列b的长度,满足条件b[i-1]&b[i]!=0
思路:
线性dp
记f[i]为当前 二进制第i位 达成的最长子序列长度
枚举每一个数,那么站在这个数的角度上看,只要这个数的二进制位为1,这一位的f就可以进行转移
由于&,所以取所有为1的二进制位的f的最大值进行转移即可
当转移完成,这些为1的二进制位的f就都要更新成此时的最大值
void solve(){
int n;cin>>n;
int big=0;
int ans=0;
rep(i,1,n){
int a;cin>>a;
for(int j=0;j<=31;j++){
if(a&(1ll<<j)){
big=max(big,f[j]+1);
}
}
for(int j=0;j<=31;j++){
if(a&(1ll<<j)){
f[j]=big;
}
}
ans=max(ans,big);
}
cout<<ans<<endl;
}

浙公网安备 33010602011771号