P4310 绝世好题

jennie

怎样处理呢

\(O(n^2)\)肯定不行

不如,二进制拆分一下

这样\(do_i\)表示第i位为1的最长长度

对于每一个数,如果他的某一个二进制位为1,那么他可以从之前这一位为1的状态转移过来,然后转移这一位为1的状态

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int f[33];
int n;
int x;
int ans;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		scanf("%d",&x);
		int k=0;
		for(int j=0;j<=30;++j){
			if((1<<j)&x) k=max(k,f[j]+1);
		}
		for(int j=0;j<=30;++j){
			if((1<<j)&x) f[j]=max(k,f[j]);
		}
		ans=max(ans,k);
	}
	cout<<ans;
	return 0;
}
posted @ 2021-09-13 21:46  Simex  阅读(16)  评论(0编辑  收藏  举报