传送门
思路:
按照每一位来进行DP
f[i]
表示最后一个数的第i个二进制为1的最长子序列个数
每次转移时把
a[i]
拆成二进制位,然后取数为1的位上
f
<script type="math/tex" id="MathJax-Element-66">f</script>最大值就可以了
#include<bits/stdc++.h>
using namespace std;
int n,ans;
int f[100002];
main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
int x,maxn=0;
scanf("%d",&x);
for (int j=1,t=x;t;t>>=1,j++)
if (t&1) maxn=max(maxn,f[j]);
for (int j=1,t=x;t;t>>=1,j++)
if (t&1) f[j]=max(maxn+1,f[j]);
}
for (int i=1;i<=n;i++) ans=max(f[i],ans);
printf("%d",ans);
}