绝世好题(线性dp)
给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len)。
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄
Input 输入文件共2行。 第一行包括一个整数n。 第二行包括n个整数,第i个整数表示ai。
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。 Output 输出文件共一行。 包括一个整数,表示子序列bi的最长长度。
Sample Input 3 1 2 3
Sample Output2Hint
n<=100000,ai<=2*10^9
如果每个位置有一个为0的话,&的结果为0,只有全一的时候才为1
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<stack> #include<set> #include<map> #include<vector> #include<cmath> const int maxn=1e5+5; typedef long long ll; using namespace std; int dp[50],n,a[maxn],tmp,ans; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) { tmp = 0; for(int j=0;j<=30;j++) if(a[i]&(1<<j)) tmp=max(tmp,dp[j]+1); for(int j=0;j<=30;j++) if(a[i]&(1<<j)) dp[j]=tmp; ans=max(ans,tmp); } cout<<ans<<endl; }

更多精彩