优先队列贪心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)

相关推荐
octopus_c4 小时前
STL 之 string:auto 与范围 for、常用接口、模拟实现与深浅拷贝
开发语言·c++·算法
李帅朋4 小时前
INP-Former阅读笔记
笔记·深度学习·计算机视觉
叼烟扛炮4 小时前
Linux 学习笔记(六十一):网络编程毕业设计——Reactor 反应堆模式
linux·网络·笔记·学习·课程设计
科小怪4 小时前
Obsidian 下载安装:官网下太慢?笔记存自己电脑,不注册不联网
笔记·下载教程·obsidion
叼烟扛炮6 小时前
Linux 学习笔记(五十九):epoll 的生死抉择——LT 与 ET 模式
linux·运维·服务器·网络·笔记·学习·php
水云桐程序员13 小时前
从零开发软件的步骤,软件开发从零到完成应该怎么做?
笔记·学习·软件构建·个人开发
David猪大卫13 小时前
【Linux修炼】环境变量、进程地址空间
linux·c语言·经验分享·笔记·学习·ubuntu·centos
叼烟扛炮14 小时前
Linux 学习笔记(五十六):IO 多路复用初探——select 的“三宗罪”
linux·服务器·数据库·笔记·学习·php
汉克老师14 小时前
CSP-J 2026 第二轮入门组真题解析(第一题 、旅游)
c++·csp-j·信息学竞赛·小学生学c++
xiaoye-duck15 小时前
《C++ 项目:手写大模型接入 SDK》Gemini接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型