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