bzoj4300: 绝世好题(DP)

  按位DP f[i]表示第i位为1的最长子序列

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio> 
#include<algorithm>
#define ll long long 
using namespace std;
int n,x,ans,mx;
int f[31];
void read(int &k)
{
    int f=1;k=0;char c=getchar();
    while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
    while(c<='9'&&c>='0')k=k*10+c-'0',c=getchar();
    k*=f;
}
int main()
{
    read(n);
    for(int i=1;i<=n;i++)
    {
        read(x);mx=0;
        for(int j=0;j<=30;j++)
        if(x&(1<<j))mx=max(mx,f[j]+1);
        for(int j=0;j<=30;j++)
        if(x&(1<<j))f[j]=max(f[j],mx);
        ans=max(ans,mx);
    }
    printf("%d\n",ans);
    return 0;
}
View Code

 

posted @ 2017-08-29 17:15  Sakits  阅读(123)  评论(0编辑  收藏  举报