bzoj 4300
这题让我很容易想起了求最长上升子序列,但是直接朴素算法 O( n ^ 2 ) 会超时。
考虑数在 int 范围内,那只需要保存二进制下某位为 1 的数为结尾的最大长度即可。
#include"cstdio" #include"cctype" #include"algorithm" using namespace std; int read() { int c,x=0; while(!isdigit(c=getchar())); while(x=x*10+c-'0',isdigit(c=getchar())); return x; } int f[31]; int main() { int n=read(),ans=0; for(int i=1;i<=n;i++) { int v=read(),now=0; for(int j=0;j<=30;j++) if(v&(1<<j)) now=max(f[j]+1,now); for(int j=0;j<=30;j++) if(v&(1<<j)) f[j]=max(now,f[j]); } for(int i=0;i<=30;i++) ans=max(f[i],ans); printf("%d",ans); return 0; }