绝世好题-按位DP

Posted bhllx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了绝世好题-按位DP相关的知识,希望对你有一定的参考价值。

n2暴力就不讲了。听人讲可以吸氧水过去。

这里考虑怎么优化这一个算法,

其实可以发现这个题唯一的限制就是要求满足a[i]&a[j]!=0。

那么我们可以想到,两个数只要有一位(二进制下)都是1,那么就是满足的。

所以我们对于每一个新的数,分别考虑它的二进制下的每一位,

如果那一位上是1,那么直接 接上之前的这一位上也为1的最长一段。

那么我们可以只存下这二进制下每一位为1时最长的值就OK了。

所以这就是按位DP??,我也不知道诶

 

#include <bits/stdc++.h>
using namespace std;
inline int gi () {
    int x=0,w=0; char ch=0;
    while (!(ch>=0 && ch<=9)) {if (ch==-) w=1; ch=getchar ();}
    while (ch>=0 && ch<=9) x= (x<<3)+(x<<1)+(ch^48), ch=getchar ();
    return w?-x:x;
}

const int N=1e5+10;

int n,Ans,a[N],f[33];

inline int Max (int a, int b) {return a>b?a:b;}

int main ()
{
    n=gi ();
    for (int i=1;i<=n;++i) a[i]=gi ();
    for (int i=1,k;i<=n;++i) {
        k=1;
        for (int j=0;j<=30;++j)
            if ((1<<j)&a[i]) k=Max (k, f[j]+1);
        for (int j=0;j<=30;++j)
            if ((1<<j)&a[i]) f[j]=Max (f[j], k);
        Ans=Max (Ans, k);
    }
    printf ("%d
", Ans);
    return 0;
}

 

以上是关于绝世好题-按位DP的主要内容,如果未能解决你的问题,请参考以下文章

bzoj4300 绝世好题(位运算+DP)

bzoj 4300 绝世好题——DP

绝世好题

[bzoj 4300]绝世好题

P4310 绝世好题 [位运算优化dp]

bzoj4300绝世好题