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

    因为涉及到位运算,所以考虑按位处理。

    \(dp[i][j]\) 表示当前考虑用前 \(i\) 个数组成序列,最后一个数的二进制下第 \(j\) 位是 \(1\) 的最长序列的长度。

    需要满足 \(b_i\&b_{i+1} \ne 0\) ,就要保证 \((1<<k)\&a_i \ne 0\)\(k\) 为上一个数的第 \(k\) 位。

    方程就容易写出 \(dp_{i,j}\) \(= max\) \(\{\) \(dp_{i-1,k}+1|\) \((1<<j)\&a_i>0\) \(,(1<<k)\&a_i>0\}\)

    然后第一维可以滚掉,直接写成 \(dp[j]\)

    Code:

    #include<stdio.h>
    #define N 100007
    int n;
    int a,f[35],maxx=0;
    inline int max(int x,int y){return x>y? x:y;}
    inline void read(int &x){
        x=0;char c=getchar();
        while(c<'0'||c>'9') c=getchar();
        while(c>='0'&&c<='9'){x=x*10+c-48;c=getchar();}
    }
    int main(){
        read(n);
        for(int i=1;i<=n;i++){
            read(a);
            int rest=1;
            for(int j=30;j>=0;j--)
                if(a&(1<<j)) rest=max(f[j]+1,rest);
            for(int j=30;j>=0;j--)
                if(a&(1<<j)) f[j]=max(rest,f[j]); 
        }
        for(int i=0;i<=30;i++)
            maxx=max(maxx,f[i]);
        printf("%d",maxx);
    }
    
  • 相关阅读:
    jQuery基础及选择器
    JavaScript面向对象
    JavaScript操作DOM
    JavaScript Bom对象
    jquery内容
    jQuery基础
    正则表达式
    表单校验
    使用jQuery操作DOM
    jQuery中的动画
  • 原文地址:https://www.cnblogs.com/wwlwQWQ/p/12407375.html
Copyright © 2011-2022 走看看