4300: 绝世好题
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1662 Solved: 849
[Submit][Status][Discuss]
Description
给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len)。
Input
输入文件共2行。
第一行包括一个整数n。
第二行包括n个整数,第i个整数表示ai。
Output
输出文件共一行。
包括一个整数,表示子序列bi的最长长度。
Sample Input
3
1 2 3
1 2 3
Sample Output
2
HINT
n<=100000,ai<=2*10^9
Source
这道题其实想到了就简单了,是一道根据位计算的DP题。
因为两个&为0的话,必须得所有位置都至少有一个为0
那么这一位,两个数都是1的话,就不会为0了
令f[i]表示第i位为1的最长长度,然后转移就好了。
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<algorithm> #include<cstring> #include<string> #include<vector> #include<map> #include<set> #include<queue> using namespace std; int n,f[51]; int main() { scanf("%d",&n); memset(f,0,sizeof(f)); int i,j; int ans=0; for (i=1;i<=n;i++) { int x; scanf("%d",&x); int t=0; for (j=0;j<=30;j++) if (x&(1<<j)) t=max(t,f[j]+1); for (j=0;j<=30;j++) if (x&(1<<j)) f[j]=t; ans=max(ans,t); } printf("%d ",ans); }