传送门
思路:
按照每一位来进行DP
f[i]
表示最后一个数的第i个二进制为1的最长子序列个数
每次转移时把
a[i]
拆成二进制位,然后取数为1的位上
f
最大值就可以了
#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);
}
本文介绍了一种使用动态规划解决特定最长子序列问题的方法。通过将每个数转换为二进制形式并利用其特性,实现了高效的计算。文章详细展示了如何遍历二进制位来更新状态,最终得到问题的解答。

566

被折叠的 条评论
为什么被折叠?



