题目名我已经无力吐槽。
A:你是萝莉控吗?
B:。。。。。我给你道题目吧!
有一个长度为 n 的正整数数组 A ,满足 Ai>=Ai+1 ,现在构造一个数组 B ,令 Bi=∑nj=iBj 。
现在,有一个 n∗n 的网格图,左下角坐标是 (1,1) ,右上角坐标是 (n,n) 。有一个人正在坐标为 (n,1) 的位置,每一时刻,如果他现在在 (x,y) ,他可以选择走到 (x−1,y+1) 或者 (x,⌈y/2⌉) ,如果选择后者,他要支付 Bx 的代价。
现在他想走到 (1,1) ,你可以告诉他他支付的代价最少是多少吗?注意在任何时候他都不能离开这个网格图。
模拟。
直接走。搜索。30分。
其实这个搜索可以写成DP。
根据这题的DP式,我们想到一个老朋友:哈夫曼树。
首先【前提】,你得对哈夫曼树的DP形式足够熟悉。
哈夫曼树的点,我们按照权值 Ci 从小到大排序,依次加入树中。
我们设 Gi,j 表示当前正在把第 i 个点放进哈夫曼树里,此时树上有 j 个空节点的最小代价。所谓空节点,就是放了不用增加代价的点( Gi,j 中预支了剩余的点放在这 j 个空节点的代价)
那么转移就很明郎了。我们用顺推来便于记忆和理解。
这就是哈夫曼树的DP形式。
关于哈夫曼树的经典算法我们就不赘述了, O(nlogn) 。
这和我们这一题有什么关系呢?
把 B 展开
G 和 F 是不是非常的像,简直就是逆过程!除了最后一项。
我们考虑一下 Gi,j∗2 和 Gi,j∗2−1 的差别。同是由 Gi,j 推过来的,少一个空位难道会比多一个空位更优吗?显然是不会的,暂且不论这个空位能不能用上, Gi,j∗2≤Gi,j∗2−1
我们来检测一下。
C 是递增的, A 也是。
G1,1=0 求的是 min(Gn+1,k 0≤k≤maxj)
Fn+1,0=0 求的是 F1,1
这里产生了一点差异,就是 Fn+1,0 ,那么我们的 min(Gn+1,k 0≤k≤maxj) 其实等于什么呢?
对于这个最终答案,我们的哈夫曼树可以是多叉的。
鉴于题目特殊性,我们看看二叉的哈夫曼树有什么特殊性质。
对于一个最优的二叉哈夫曼树,一定不存在挂空的空节点。
证明:如果最优的二叉哈夫曼树存在某个空节点,必定存在一个叶子节点的对应位置为空。那么我们可以把这个叶子节点往上移,删除这个空节点,达到更优的解法。与题设的最优性质冲突,所以对于一个最优的二叉哈夫曼树,一定不存在挂空的空节点。证毕。
此时,原问题就是哈夫曼树问题的逆问题。由于这是一个递推,所以两问题等价。
就是很隐蔽的哈夫曼树。
这题比NOI的哈夫曼树隐蔽的多了。
要对哈夫曼树的DP形式足够熟悉和敏感。
正所谓吃一堑长一智,下次不会眼瞎了。
突破点: Ai>=Ai+1 , Bi=∑nj=iBj , (x,⌈y/2⌉)
PS.本校的不懂的请问富榄