优先队列贪心dp

切割绳子价值最小化

问题重述

  • 有若干根绳子(或一根总绳)

  • 最多切 K​ 刀,得到若干段

  • 段越短,价值越低,且呈指数下降

  • 目标:总价值最小

  • 每次切割的收益 = 切割前段价值 - 切割后两段价值之和(收益 > 0 才值得切)


数学模型

根据题目可见,尽量把最长段变小就是合理解。但是这里有一个细节,一个绳直接切一刀把两段压入数组,再次切这个绳会出现12 6 6 6 3 3 这种情况,实际上两刀切到一个绳子上完全可以变成4 4 4的段,这也是为什么要用价值优先队列转移

设一段长度为 x,其价值为:

复制代码
val(x) = e^(-λx)   或   val(x) = 1 / x^p

切割收益:

复制代码
gain = val(x) - val(a) - val(x-a)

每次选 gain 最大的段切一刀


代码略


常见价值函数替换表

物理意义 公式 代码
指数衰减 e^(-λx) exp(-LAMBDA * x)
平方反比 1/x² 1.0 / (x * x)
幂律 1/x^p pow(x, -P)
对数 -ln(x) -log(x)
线性 ax + b A * x + B

为什么贪心是对的?(简要证明)

交换论证

  • 假设最优解不是每次切收益最大的段

  • 存在一次切割 A(收益大)未被选,另一次切割 B(收益小)被选

  • 交换这两次切割顺序,总价值不会变差

  • 因此贪心选择是最优的


复杂度分析

  • 时间:O(K log K)

  • 空间:O(K)

相关推荐
weixin_3077791311 分钟前
一维无粘 Burgers 方程的激波形成问题:MacCormack 格式求解
c++·算法·matlab
HugoStudio_SWAN33 分钟前
洛谷 B4500 / B4449 / B3843 凯撒密码、密码强度与密码合规——加密与安全的三道门
c++·学习·程序人生·算法·安全
雾里看山1 小时前
源码目录、构建目录与 out-of-source build
c++·软件构建·cmake
枫叶林FYL2 小时前
【群体智能集群控制工程实践】第3章 一致性协同算法
算法
禹凕2 小时前
滑动窗口算法实战指南
python·算法
DisonTangor2 小时前
【腾讯混元雪耻归来】 Hy4 preview:770B 参数 MoE 旗舰模型,1M 上下文全面开源
人工智能·算法·开源·aigc·腾讯云·腾讯云ai代码助手
推送者2 小时前
用宠物照片制作桌宠:从AI拆帧到九点标定的本地化实现笔记
笔记·宠物·用宠物照片制作桌宠
一条破秋裤2 小时前
16_TIM编码器接口测速
笔记·stm32·学习
tju新生代魔迷2 小时前
Verilog HDL 学习笔记(十)| 第10章 时序和延迟
笔记·学习·fpga开发
明月_清风3 小时前
从二叉树到 B+ 树:一文搞懂工程中「树」的演化之道
数据结构·算法·go