標籤:pre ora 它的 max include ace ret 暴力 一段
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\n", Ans); return 0;}
絕世好題-按位DP