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

题目大意

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

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

其中Bx=ni=xAiA是给出的一个长度为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的。但是原问题就对应于2j2j1都可以转移回到j。然而我们DP构建哈夫曼树的过程显然是构建2j个叶子更优。也就是说尽管原问题中2j1确实是可以转移到j但它绝对不会优于2j。因此原问题和新问题是对应的。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值