[DP] BZOJ4300: 绝世好题

xiaoxiao2021-02-28  94

题意

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

题解

绝世傻逼题。只是来水一发blog 设f[i]表示以i为结尾的最长长度,推的时候对于2进制每位,记一下在这位上有1的所有a[i]对应的f[i]的最大值即可。 复杂度 O(nlog2a[i])

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=100005; int n,ans,a[maxn],f[maxn],bit_m[35]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++){ f[i]=1; for(int j=0;j<=31;j++) if((a[i]>>j)&1) f[i]=max(f[i],bit_m[j]+1); for(int j=0;j<=31;j++) if((a[i]>>j)&1) bit_m[j]=max(bit_m[j],f[i]); } for(int i=1;i<=n;i++) ans=max(ans,f[i]); printf("%d\n",ans); return 0; }
转载请注明原文地址: https://www.6miu.com/read-32646.html

最新回复(0)