您的位置:首页 > 其它

bzoj4300: 绝世好题(dp)

2015-11-07 16:26 405 查看
题目链接

题意:给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len)。

解答:考虑到按位与,我们可以思考,某一位都是1的情况,使用dp[i]:表示数X的二进制i位置是1的时候,最大长度,然后暴力计算。

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define X first
#define Y second
#define cl(a,b) memset(a,b,sizeof(a))
typedef pair<int,int> P;
const int maxn=1005;
const int inf=1<<27;
int dp[34];
int main(){
int n;scanf("%d",&n);
for(int i=0;i<n;i++){
int x;scanf("%d",&x);
int tmp=0;
for(int j=0;j<31;j++)if(x&(1<<j)){
tmp=max(tmp,dp[j]+1);
}
for(int j=0;j<31;j++)if(x&(1<<j)){
dp[j]=max(dp[j],tmp);
}
}
int ans=0;
for(int i=0;i<31;i++){
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: