- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
问题是:
给定一个数组,表示 table 上杆的长度。每次选择两根杆并将它们连接起来并获得一根新杆。这样做直到 table 上只有一根杆。连接的成本是两根杆的长度之和,例如,连接 2 和 3 将得到 5 根杆,成本为 5。什么是最低成本连接策略?
贪心:每次取最短的两根,把连接好的新杆放回 table 上。
例子:
[1,2,3,4,5] ,选择 1 和 2 花费 3 [3,3,4,5],选择 3 和 3 花费 6 [4,5,6],选择 4 和 5 花费9[6,9],挑6,9花费15,所以总花费是33。
我们不能简单的说,总的连接次数是n-1,每次都取最小的两个,最后得到一个最小的cost。因为每一次挑都会改变 future ,像挑1+2和挑2+4都会导致下一步的两套不同的竿。
我如何证明这种贪婪会得到最小的成本?
最佳答案
证明类似于霍夫曼编码最优的证明。
每个策略对应一个二叉树。它包含其叶子中的所有初始杆,内部顶点对应于连接操作。
可以看出,对于一棵固定树,连接杆的成本是所有叶子 v
上的 a[v] * depth[v]
的总和,其中a[v]
是初始杆的长度,depth[v]
是叶的深度。之所以如此,是因为每根杆恰好参与连接 depth[v]
次。
我们需要证明存在一个最优策略,使得它的树有两个最短的杆作为 sibling 。
假设 T
是一棵最优树。让我们按深度对它的叶子进行排序(按非严格递减顺序)。如果最短的两根杆是前两片叶子,我们就完成了。否则,让我们继续将它们与它们的左兄弟(至少与它们一样长)交换,直到它们进入前两个位置。当我们交换 2 个叶子 u
和 v
时,成本变化是 -depth[u] * a[u] - depth[v] * a[v] + depth[u] * a[v] + depth[v] * a[u]
= (depth[v] - depth[u]) * (a[u] - a[v] )
。第一项是非正的(因为叶子是按高度排序的),第二项是非负的(因为 a[u] >= a[v]
)。因此,成本变化为负或零。
因此,存在一棵最优树,其中两个最短的杆是 sibling 。这意味着存在一个最佳策略,即在我们做任何其他事情之前将这两根杆连接起来。
关于algorithm - 如何证明这个贪心算法是最优的 : rod connection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43715207/
>>> import re >>> p = re.compile('.*&l=(.*)(&|$)') >>> p.search('foo&l=something here&bleh').group(1
最近有一道面试题如下:我们得到了一个单词列表,我们想要格式化它们以最大化回车符的数量,同时将每行的字母数量保持在一个范围内。 例如,我们希望每行的字母范围为 5 - 10(含),一种解决方案是: he
我正在使用二维数组来处理游戏中的对象。数组的维度就像笛卡尔网格上的坐标。当玩家选择一个点时,我想从数组中收集 N 个最近的网格单元,即使该点不是有效的数组索引。 例子:从 [0,0] 到 [10,10
我在 Hibernate 之上使用 Olingo 1.2。 我有一个返回 250 行的请求,每行以一对多关系链接到另一个表。 我执行 $expand 以获取子表中的所有数据,但是当我检查在数据库中执行
我正在 ANTLR4 中构建语法,但收到此警告 TL4.g4:224:12: greedy block ()* contains wildcard;非贪婪语法 ()*?可能是首选 这是它引用的代码行
In the default greedy mode, all data offered to targets are accepted, even if the other target doesn
假设我有 n 个盒子,每个盒子里面都有一些值 b[i] .我可以保证对一组框进行排序,使得 b[1] j; { min_{k=i}^j (c[k] + max(T(i, k-1)
本文已收录到 AndroidFamily ,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,我是小彭。 上周末是 LeetCode 第 339 场周赛,你参加
什么是 PHP 中的“贪心 token 解析”?我在 Codeigniter 指南中找到了这个: “除非需要解析变量,否则始终使用单引号字符串,并且在确实需要解析变量的情况下,使用大括号防止贪婪的标记
本文已收录到 AndroidFamily ,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,我是小彭。 上周末是 LeetCode 第 337 场周赛,你参加
我是一名优秀的程序员,十分优秀!