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;
}
posted @ 2025-05-10 10:07  Marinaco  阅读(20)  评论(0)    收藏  举报
//雪花飘落效果