题意
有一个(小SB)人要从(n,1)走到(1,1),每次他有两种走法:
①(x−1,y+1)
无损耗
②⌊(x,(y+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,j−1]
,表示在剩下可放的节点中选一个来放第(i+1)个,无代价。
②F[i,j∗2]+Σa[i+1 n]
,表示把剩下的j个叶子节点往下再扩展2个节点,原叶节点作废。
第二种不太好理解。
圆圈表示已放的节点,三角表示可以放且已作废的叶节点,方块表示二次扩展的叶节点。
如图,一个三角分成了两个方块,所以叶节点个数*2。
回到第一种情况,如果我删掉了灰色三角,即在灰色三角处放了一个数,可以发现后来不会重复计算放过的叶节点(灰方块)。
正解
观察上面的转换过程,可以发现其实就是题目给出的逆操作。
所以题目其实就是求序列为a的哈夫曼树的最小权值。
最小权值=min(每个节点深度(根节点是0)*该节点权值)
所以,为了保证总值最小,要用大数*小数。
每次就用最小的两个数合并,对答案的贡献就是两数之和。
堆维护搞定。
后记
其实这道题就是旧OJ的合并果子高级版。。。

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

1358

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



