题目大意
你在一个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)
1440

被折叠的 条评论
为什么被折叠?



