[CF1699E] Three Days Grace 题解
一道非常巧妙的 dp 题,但是顺着思路水到渠成并不是完全无迹可寻。
首先观察到题面中答案的形式是最值相减,提醒我们使用双指针的思想,即枚举最小值的过程中动态单调维护最大值,同时注意到本题中的操作类型是将一个数拆成两个数相乘的形式,所以可以想到是从大到小枚举,且思考加入控制了最大值,则要将比最大值大的数拆开,不是很好控制拆成那些数,拆的数的数量,所以考虑从大到小枚举最小值,同时控制最大值。
接下来考虑如何去控制最大值,如字面意思一般,我们希望让最大值尽量小,但是有不能在分解过程中产生比我们确定的最小值更小的值,单纯的用贪心似乎并不适合解决这个问题,所以我们考虑使用 dp。
本着求什么设什么的原则,我们设 表示满足能将 分解成多个数相乘且所有数都被包含在区间 内的最小的 ,在具体实现过程中状态中的第一维 可以压掉。接下来考虑转移,首先可以想到肯定是从大到小枚举 ,对于每个 ,任何一个 的分解只有几种可能,要么根本不能分出 ,要么分出几个 ,要么能分不分,分别考虑转移,前后两种转移都是直接继承上一次的答案, 那维压掉后即不变,中间的转移考虑到一个数不一定只分出一个 ,所以可以考虑使用类似多重背包的优化,正向枚举直接转移,。
然后我们发现上面的转移过程中 数组随 变小是单调变小的,即最大值不会变大,我们就可以进行上面的双指针,对于每个集合中存在的 ,标记 ,然后用一个指针指向最后一个标记,标记位置单调前移,每次计算答案,代码实现难度不大。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现