jzoj4210. 【五校联考1day1】我才不是萝莉控呢(哈夫曼树)

本文介绍了一种利用哈夫曼树解决特定路径选择问题的方法,并通过算法优化实现了问题的有效解决。文中详细阐述了哈夫曼树的概念、构建过程及其在实际问题中的应用。

题意

有一个(小SB)人要从(n,1)走到(1,1),每次他有两种走法:
x1y+1 无损耗
xy+1/2 代价为 Σa[i](i=x...n)

50分

设F[i,j]表示该SB位置为(i,j),然后转移乱搞 N2

转换

先引入一个概念。

哈夫曼树
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
1、路径和路径长度
在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。
2、结点的权及带权路径长度
若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。
3、树的带权路径长度
树的带权路径长度规定为所有叶子结点的带权路径长度之和为WPL。

如果要求一颗最小代价的哈夫曼树,应该怎么求?
设F[i,j]表示当前已经放了前i个节点(从小到大排序),剩余可放节点个数为j。
那么有两种转移:
F[i+1,j1] ,表示在剩下可放的节点中选一个来放第(i+1)个,无代价。
F[i,j2]+Σa[i+1 n] ,表示把剩下的j个叶子节点往下再扩展2个节点,原叶节点作废

第二种不太好理解。
这里写图片描述

圆圈表示已放的节点,三角表示可以放且已作废的叶节点,方块表示二次扩展的叶节点。
如图,一个三角分成了两个方块,所以叶节点个数*2。

这里写图片描述
回到第一种情况,如果我删掉了灰色三角,即在灰色三角处放了一个数,可以发现后来不会重复计算放过的叶节点(灰方块)。

正解

观察上面的转换过程,可以发现其实就是题目给出的逆操作。
所以题目其实就是求序列为a的哈夫曼树的最小权值。
最小权值=min(每个节点深度(根节点是0)*该节点权值)
所以,为了保证总值最小,要用大数*小数。
每次就用最小的两个数合并,对答案的贡献就是两数之和。
堆维护搞定。

后记

其实这道题就是旧OJ的合并果子高级版。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值