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

相关推荐
一隅论数智4 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
倒头就睡的小比特4 天前
算法竞赛C++常用的STL
c++·算法
weilx12344 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼4 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
Smileyqp沛沛4 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车4 天前
C/C++ 为什么需要编译器?
开发语言·c++
深圳老胡4 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
旖旎夜光4 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark4 天前
大规模并行计算中的负载均衡算法研究4
算法