给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len)。
n<=100000,ai<=2*10^9
肥肠水的dp,直接从前往后转移取max就行。。
代码:
1 // luogu-judger-enable-o2 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 using namespace std; 6 int n,ans; 7 int bin[31],last[31],b[100001]; 8 int main() 9 { 10 scanf("%d",&n); bin[0]=1; 11 for(int i=1;i<=30;i++) bin[i]=bin[i-1]<<1; 12 for(int i=1;i<=n;i++) scanf("%d",&b[i]); 13 for(int i=0;i<=30;i++) if(bin[i]&b[1]) last[i]++; 14 for(int i=2;i<=n;i++) 15 { 16 int maxn=0; 17 for(int j=0;j<=30;j++) if(bin[j]&b[i]) maxn=max(last[j],maxn); 18 for(int j=0;j<=30;j++) if(bin[j]&b[i]) last[j]=maxn+1; 19 } 20 for(int i=0;i<=30;i++) ans=max(ans,last[i]); 21 printf("%d",ans); 22 return 0; 23 }
原文:https://www.cnblogs.com/Slrslr/p/9678214.html