Luogu P4310 绝世好题 题解 [ 绿 ] [ 线性 dp ] [ 单调队列优化 ] [ 二进制优化 ]
题目:绝世好题。
暴力 dp
显然
单调队列优化
观察到只有某二进制位两个数都为
因为我懒 因为没有弹出元素操作并且多个 log 无伤大雅,所以单调队列可以用优先队列代替。
单调队列的时间是
代码就不写了。
二进制优化
定义
我们在 dp 时,先找出
#include <bits/stdc++.h>
using namespace std;
int n,a,f[40],ans=0;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a;
int tmp=0;
for(int j=0;j<=32;j++)
{
if((a>>j)&1)
{
tmp=max(tmp,f[j]);
}
}
for(int j=0;j<=32;j++)
{
if((a>>j)&1)
{
f[j]=max(f[j],tmp+1);
}
ans=max(ans,f[j]);
}
}
cout<<ans;
return 0;
}
时间
本质是滚动数组充当了我们单调队列的作用,因为它会存下某一位结尾的最大长度,而不用我们手动去找,并且还省空间。
标签:
动态规划 dp
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战