给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len)。
输入文件共2行。 第一行包括一个整数n。 第二行包括n个整数,第i个整数表示ai。
输出文件共一行。 包括一个整数,表示子序列bi的最长长度。
3
1 2 3
2
n<=100000,ai<=2*10^9
闲来无事,翻别人博客,看到一个标题为绝世好题的博文,我就天真的点进去了。。。结果。。这明明是数位dp啊。。。。哪里绝世好题了(#`O′)!!! 设f[i]为以第i+1位(二进制位)有1的数结尾得到的序列的最长长度,……然后随便搞一下就好了。。。
#include <algorithm> #include <cstdio> using namespace std; const int K=1<<5; int n,ans; int f[K]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { int t,mx=0; scanf("%d",&t); for(int j=0;j<K;j++) if(t&(1<<j)) mx=max(mx,f[j]+1); for(int j=0;j<K;j++) if(t&(1<<j)) f[j]=mx; ans=max(ans,mx); } printf("%d\n",ans); return 0; }