zoukankan      html  css  js  c++  java
  • BZOJ 4300: 绝世好题

    4300: 绝世好题

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 1662  Solved: 849
    [Submit][Status][Discuss]

    Description

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

    Input

    输入文件共2行。
    第一行包括一个整数n。
    第二行包括n个整数,第i个整数表示ai。
     

    Output

    输出文件共一行。
    包括一个整数,表示子序列bi的最长长度。
     

    Sample Input

    3
    1 2 3

    Sample Output

    2

    HINT

    n<=100000,ai<=2*10^9


    Source

    By Oxer

    这道题其实想到了就简单了,是一道根据位计算的DP题。

    因为两个&为0的话,必须得所有位置都至少有一个为0

    那么这一位,两个数都是1的话,就不会为0了

    令f[i]表示第i位为1的最长长度,然后转移就好了。

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<vector>
    #include<map>
    #include<set>
    #include<queue>
    using namespace std;
    int n,f[51];
    int main()
    {
        scanf("%d",&n);
        memset(f,0,sizeof(f));
        int i,j;
        int ans=0;
        for (i=1;i<=n;i++)
        {
            int x;
            scanf("%d",&x);
            int t=0;
            for (j=0;j<=30;j++)
                if (x&(1<<j))
                    t=max(t,f[j]+1);
            for (j=0;j<=30;j++)
                if (x&(1<<j))
                    f[j]=t;
            ans=max(ans,t);
        }
        printf("%d
    ",ans);
    }
  • 相关阅读:
    预习原码补码
    C语言I作业12-学期总结
    C语言I博客作业11
    C语言I博客作业10
    C语言I博客作业09
    C语言I博客作业08
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业05
    C语言I作业004
  • 原文地址:https://www.cnblogs.com/hnqw1214/p/6476072.html
Copyright © 2011-2022 走看看