题目大意
你在一个
n×n
的网格图上,初始站在
(1,1)
点,要求到达
(n,n)
点。
假如你现在在
(x,y)
点,那么你有两种行走方式。
- 走到 (x+1,y+1) 点
- 花费 Bx 的代价走到 (x,⌈y2⌉)
其中
Bx=∑ni=xAi
,
A
是给出的一个长度为
分析
答案实际上是 A 序列构出的哈夫曼树的代价。(经典例题合并果子)
经典的哈夫曼树构建方式是用堆来维护。
考虑如何用DP来求得哈夫曼树。
由于这个序列是降序的,那么我们可以知道这个序列的点所在深度构成的序列也应该是递增的。不妨设
- 将当前点占用一个叶子
用 fi,j 的值更新 fi+1,j−1 - 将所有的叶子都扩展出
2
个叶子节点
用fi,j+∑nj=iai 的值更新 fi+1,2j
为什么是加上后面一段求和呢?
因为我们后面放置的东西深度都加一了。
为什么是将所有的叶子都扩展
2
个叶子而不是部分呢?
因为假如我们有必要扩展部分的话,不扩展的部分必定是用来放某个序列中的位置,那么我们只需要先进行操作
这个DP显然是原问题的逆过程。至于为什么是上取整,由于我们每个叶子都扩展出
那么直接套用堆来解决。
时间复杂度
O(nlogn)