bzoj 4300

这题让我很容易想起了求最长上升子序列,但是直接朴素算法 O( n ^ 2 ) 会超时。

考虑数在 int 范围内,那只需要保存二进制下某位为 1 的数为结尾的最大长度即可。

#include"cstdio"
#include"cctype"
#include"algorithm"
using namespace std;
int read()
{
    int c,x=0; while(!isdigit(c=getchar()));
    while(x=x*10+c-'0',isdigit(c=getchar()));
    return x;
}
int f[31];
int main()
{
    int n=read(),ans=0;
    for(int i=1;i<=n;i++)
    {
        int v=read(),now=0;
        for(int j=0;j<=30;j++) if(v&(1<<j)) now=max(f[j]+1,now);
        for(int j=0;j<=30;j++) if(v&(1<<j)) f[j]=max(now,f[j]); 
    }
    for(int i=0;i<=30;i++) ans=max(f[i],ans);
    printf("%d",ans);
    return 0;
}

 

posted @ 2018-02-26 14:23  312432424  阅读(97)  评论(0编辑  收藏  举报