bzoj 4300(dp)(贪心)

来源:互联网 发布:c语言字符串最前面是0 编辑:程序博客网 时间:2024/05/17 23:39

传送门
题解:按位dp,看穿之后就是大水题。对于每一位,如果and起来为1的话就更新答案。但是之后这一步就涉及到贪心思想,对于几个数,如果有一位and起来为1的话,那么它们and起来一定不为0,所以其它按位and为1的位上也要更新dp值。

#include<bits/stdc++.h>using namespace std;const int MAXN=1e5+2;int n,x,dp[32],ans=0;int main() {    memset(dp,0,sizeof(dp));    scanf("%d",&n);    for (int i=1;i<=n;++i) {        int mx=0;        scanf("%d",&x);        for (int j=0;j<=30;++j)            if (x&(1<<j)) mx=max(mx,dp[j]+1);        for (int j=0;j<=30;++j)            if (x&(1<<j)) dp[j]=mx;        ans=max(ans,mx);    }    printf("%d\n",ans);}