BZOJ4300&&洛谷P4310 绝世好题

一道还算简单的dp

n^2的想法是对于每个num[i]遍历每个数使 a&b=1这里ab是对应2进制位

但是因为要求是序列,所以是不能跳的,所以我们对于num[i]的每一位,遍历上一次他出现的位置就行了

代码

//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,num[100500],nxt[40],f[100500];
inline int read()
{
	int x=0;char ch=getchar();
	while (ch>'9'||ch<'0') ch=getchar();
	while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return x;
}
signed main()
{
	n=read();int ans=0;
	for (int i=1;i<=n;i++) num[i]=read(),f[i]=1;
	for (int i=1;i<=n;i++)
		for (int k=0;k<=30;k++)
			if (num[i]&(1<<k)) f[i]=max(f[i],f[nxt[k]]+1),nxt[k]=i;
	for (int i=1;i<=n;i++) ans=max(ans,f[i]);
	cout<<ans;
	return 0; 
}

猜你喜欢

转载自blog.csdn.net/ACerAndAKer/article/details/81359761