这题让我很容易想起了求最长上升子序列,但是直接朴素算法 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; }