【JZOJ】4210 我才不是萝莉控呢!

题目名我已经无力吐槽。

Description

A:你是萝莉控吗?
B:。。。。。我给你道题目吧!
有一个长度为 n 的正整数数组 A ,满足 Ai>=Ai+1 ,现在构造一个数组 B ,令 Bi=nj=iBj
现在,有一个 nn 的网格图,左下角坐标是 (1,1) ,右上角坐标是 (n,n) 。有一个人正在坐标为 (n,1) 的位置,每一时刻,如果他现在在 (x,y) ,他可以选择走到 (x1,y+1) 或者 (x,y/2) ,如果选择后者,他要支付 Bx 的代价。
现在他想走到 (1,1) ,你可以告诉他他支付的代价最少是多少吗?注意在任何时候他都不能离开这个网格图。

Burte Force

模拟。
直接走。搜索。30分。
其实这个搜索可以写成DP。

Fi,j=min(Fi+1,j1,Fi,j2+Bi,Fi,j21+Bi)

这就60了。

Analysis

根据这题的DP式,我们想到一个老朋友:哈夫曼树。
首先【前提】,你得对哈夫曼树的DP形式足够熟悉。
哈夫曼树的点,我们按照权值 Ci 从小到大排序,依次加入树中。
我们设 Gi,j 表示当前正在把第 i 个点放进哈夫曼树里,此时树上有 j 个空节点的最小代价。所谓空节点,就是放了不用增加代价的点( Gi,j 中预支了剩余的点放在这 j 个空节点的代价)
那么转移就很明郎了。我们用顺推来便于记忆和理解。

Gi,jGi+1,j1  ,  Gi,j+j=inCjGi,j2

也就是说,当前状态下,要么把 i 塞到 j 个空位的某一个里面,要么把每个空位都变成辅助节点,这样每个空位就都能多挂一个叶子节点了。相应的,这样一来剩下的所有空位置【能放的叶子节点】到根的距离都多了1,由于这些位置是为 in 准备的,所以代价要加上 nj=iCj
答案就是 min(Gn+1,k  0kmaxj)
你问我为什么要每个空位都变成辅助节点?难道不能单开一个或者仅仅是几个吗?
因为这样状态是重复的。假如我们仅仅单开了 k 个空位变成辅助节点,总空位数一定可以由之前的某个状态的空位置数推导而来,所以我们只需要考虑一起开就好了。

这就是哈夫曼树的DP形式。
关于哈夫曼树的经典算法我们就不赘述了, O(nlogn)

这和我们这一题有什么关系呢?

Fi,j=min(Fi+1,j1,Fi,j2+Bi,Fi,j21+Bi)

B 展开

Fi,j=min(Fi+1,j1,Fi,j2+j=inAj,Fi,j21+j=inAj)

Gi,jGi+1,j1  ,  Gi,j+j=inCjGi,j2

G F 是不是非常的像,简直就是逆过程!除了最后一项。

我们考虑一下 Gi,j2 Gi,j21 的差别。同是由 Gi,j 推过来的,少一个空位难道会比多一个空位更优吗?显然是不会的,暂且不论这个空位能不能用上, Gi,j2Gi,j21

我们来检测一下。
C 是递增的, A 也是。
G1,1=0 求的是 min(Gn+1,k  0kmaxj)
Fn+1,0=0 求的是 F1,1
这里产生了一点差异,就是 Fn+1,0 ,那么我们的 min(Gn+1,k  0kmaxj) 其实等于什么呢?
对于这个最终答案,我们的哈夫曼树可以是多叉的。
鉴于题目特殊性,我们看看二叉的哈夫曼树有什么特殊性质。

对于一个最优的二叉哈夫曼树,一定不存在挂空的空节点。
证明:如果最优的二叉哈夫曼树存在某个空节点,必定存在一个叶子节点的对应位置为空。那么我们可以把这个叶子节点往上移,删除这个空节点,达到更优的解法。与题设的最优性质冲突,所以对于一个最优的二叉哈夫曼树,一定不存在挂空的空节点。证毕。

此时,原问题就是哈夫曼树问题的逆问题。由于这是一个递推,所以两问题等价。

就是很隐蔽的哈夫曼树。

Summary

这题比NOI的哈夫曼树隐蔽的多了。
要对哈夫曼树的DP形式足够熟悉和敏感。
正所谓吃一堑长一智,下次不会眼瞎了。

突破点: Ai>=Ai+1 Bi=nj=iBj (x,y/2)

PS.本校的不懂的请问富榄

你可能感兴趣的:(题解)