BZOJ4300--DP

来源:互联网 发布:关键词分分析软件 编辑:程序博客网 时间:2024/06/11 09:42

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

水题一道,只要两个数有某一位上都为1,那么这两个数就能相邻,所以,我们只需要知道以某一位上为1的数结尾的序列的最长长度就可以。
代码如下:

#include<cstdio>#include<cstring>#include<algorithm>#define maxn 100006using namespace std;int n,ans,f[40],a[maxn];int _read(){    char ch=getchar();int sum=0;    while(!(ch>='0'&&ch<='9'))ch=getchar();    while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=getchar();    return sum;}int main(){    freopen("water.in","r",stdin);    freopen("water.out","w",stdout);    n=_read();    for(int i=1;i<=n;i++)a[i]=_read();    for(int i=1;i<=n;i++){        int x=a[i],p=0,Max=0;        while(x>0){            p++;            if((x&1)==1)Max=max(Max,f[p]);            x>>=1;        }        x=a[i],p=0;        while(x>0){            p++;            if((x&1)==1)f[p]=max(f[p],Max+1);            x>>=1;        }    }    for(int i=1;i<=30;i++)ans=max(ans,f[i]);    printf("%d",ans);    return 0;}
0 0