zoukankan      html  css  js  c++  java
  • BZOJ4300:绝世好题(DP)

    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

    Solution

    $f[i]$表示二进制下看第$i$位的最长子序列,一个一个读入然后更新$f[i]$就好了……

    可能看代码更好懂一点。

    Code

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 int n,x,ans,f[32];
     5 int main()
     6 {
     7     scanf("%d",&n);
     8     for (int i=1; i<=n; ++i)
     9     {
    10         int maxn=0;
    11         scanf("%d",&x);
    12         for (int j=1; j<=31; ++j)
    13             if (x&(1<<j-1)) maxn=max(maxn,f[j]);
    14         for (int j=1; j<=31; ++j)
    15             if (x&(1<<j-1)) f[j]=maxn+1;
    16         ans=max(ans,maxn+1);
    17     }
    18     printf("%d
    ",ans);
    19 }
  • 相关阅读:
    DP -- 递推
    二分查找题
    动态规划
    二分专题
    并查集
    三分法
    二分法
    插入排序
    排序小结
    Go go.mod入门
  • 原文地址:https://www.cnblogs.com/refun/p/10216618.html
Copyright © 2011-2022 走看看