P4310 绝世好题(二进制拆位)

平方做法容易想到,设 \(dp_i\) 为最大长度暴力枚举即可。
直接转化性质太烂,试一手二进制拆位。

二进制拆位,这里认为是用二进制的思想优化状态设计。
放到这道题中,发现可以用“XX 二进制位为 1 最大长度”等效进行设计。
最终时间复杂度达到 \(O(n\log n)\)

#include<bits/stdc++.h>
using namespace std;
int n,dp[30],ans;
int main(){
    scanf("%d",&n);
    for(int i=1,x,tmp;i<=n;i++){
        scanf("%d",&x),tmp=0;
        for(int j=0;j<30;j++) if(x&(1<<j))
            tmp=max(tmp,dp[j]+1);
        for(int j=0;j<30;j++) if(x&(1<<j))
            dp[j]=max(dp[j],tmp);
    }
    for(int i=0;i<30;i++) ans=max(ans,dp[i]);
    printf("%d",ans);
    return 0;
}
posted @ 2026-02-22 21:23  2025ing  阅读(0)  评论(0)    收藏  举报