数据过水
查看原帖
数据过水
307453
云浅知处はなび楼主2021/7/17 17:37

考虑在暴力枚举所有 j<i,aj&ai==0j<i,a_j\&a_i==0jj 的时候从 ii 开始往前枚举,少枚举几项

因为我们 dp 的这个 dpidp_i 大致来说是随着 ii 增长的(不是严格的单调递增,只是大致

所以我一开始大概枚举个 500500 项然后发现过了

后来想卡一卡就减到 100100 又过了

最后发现居然可以减到 44。。也就是说往前枚 44 个就能找到答案。。

直接最优解 rk1

放一下代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cstdio>

const int MN=1e5+1;

using namespace std;

inline int read(){
    int x=0,f=1;char c=getchar();
    for(;(c<'0'||c>'9');c=getchar()){if(c=='-')f=-1;}
    for(;(c>='0'&&c<='9');c=getchar())x=x*10+(c&15);
    return x*f;
}

int n,a[MN],f[MN];

signed main(void){
	
	n=read();
	for(int i=1;i<=n;i++)a[i]=read();
	
	f[1]=1;
	
	int ans=-1;
	for(int i=2;i<=n;i++){
		for(int j=i-1;j>max(0,i-4);j--)if((a[i]&a[j])!=0)f[i]=max(f[i],f[j]+1);
		ans=max(ans,f[i]);
	}
	
	cout<<ans<<'\n'; 

    return 0;
}
2021/7/17 17:37
加载中...