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;
}

浙公网安备 33010602011771号