【五校联考2015 9.5】我才不是萝莉控

题目大意

你在一个 n×n 的网格图上,初始站在 (1,1) 点,要求到达 (n,n) 点。
假如你现在在 (x,y) 点,那么你有两种行走方式。

  • 走到 (x+1,y+1)
  • 花费 Bx 的代价走到 (x,y2)

其中 Bx=ni=xAi A 是给出的一个长度为 n 的序列且满足 Ai>Ai+1

分析

答案实际上是 A 序列构出的哈夫曼树的代价。(经典例题合并果子)

经典的哈夫曼树构建方式是用堆来维护。
考虑如何用DP来求得哈夫曼树。
由于这个序列是降序的,那么我们可以知道这个序列的点所在深度构成的序列也应该是递增的。不妨设 fi,j 表示做到第 i 个点,我们有 j 个可用的叶子节点可以安放的最小代价。那么每一步我们可以做以下两个操作:

  • 将当前点占用一个叶子
    fi,j 的值更新 fi+1,j1
  • 将所有的叶子都扩展出 2 个叶子节点
    fi,j+nj=iai 的值更新 fi+1,2j

为什么是加上后面一段求和呢?
因为我们后面放置的东西深度都加一了。

为什么是将所有的叶子都扩展 2 个叶子而不是部分呢?
因为假如我们有必要扩展部分的话,不扩展的部分必定是用来放某个序列中的位置,那么我们只需要先进行操作 1 再进行操作 2 就是等价的了。

这个DP显然是原问题的逆过程。至于为什么是上取整,由于我们每个叶子都扩展出 2 个叶子,那么显然是到 2j 的。但是原问题就对应于 2j 2j1 都可以转移回到 j 。然而我们DP构建哈夫曼树的过程显然是构建 2j 个叶子更优。也就是说尽管原问题中 2j1 确实是可以转移到 j 但它绝对不会优于 2j 。因此原问题和新问题是对应的。

那么直接套用堆来解决。
时间复杂度 O(nlogn)

你可能感兴趣的:(【五校联考2015 9.5】我才不是萝莉控)