我才不是萝莉控呢
题意
&@……#(!@ 然后变成了一个
d
p
dp
dp,有:
d
p
[
i
]
[
j
]
=
m
i
n
(
d
p
[
i
+
1
]
[
j
−
1
]
,
d
p
[
i
]
[
j
∗
2
]
+
Σ
k
=
i
+
1
n
a
[
k
]
)
dp[i][j]=min(dp[i+1][j-1],dp[i][j*2]+\Sigma^n_{k=i+1}a[k])
dp[i][j]=min(dp[i+1][j−1],dp[i][j∗2]+Σk=i+1na[k])
(对应原题从终点走到起点)
我们很容易回忆起曾经学过的哈夫曼树算法:
- 一棵树的权定义为 Σ \Sigma Σ(叶子节点的权值) × \times ×(该叶子节点的深度).
- 哈夫曼树是一棵[在叶子节点大小恒定的情况下],权最小的完全二叉树.
其构建和计算权方式为:
参考1,参考2(和 Σ k = i + 1 n a [ k ] \Sigma^n_{k=i+1}a[k] Σk=i+1na[k]看起来有点联系)
由于哈夫曼树的主要特点在于权最小,那么很容易联想到 d p dp dp中不够优的就是权不是最小的那些完全二叉树.
观察 d p dp dp的递推公式发现:
- d p [ i ] [ j ] dp[i][j] dp[i][j]可以等效为 [以 a [ i ] a[i] a[i]为叶子节点] [前 i i i个叶子被放入树中] [有 j j j个空位] 的树权.
-
d p [ i ] [ j ] = d p [ i + 1 ] [ j − 1 ] dp[i][j]=dp[i+1][j-1] dp[i][j]=dp[i+1][j−1]相当于将 a [ i ] a[i] a[i]放入树中.
-
d p [ i ] [ j ] = d p [ i ] [ j ∗ 2 ] dp[i][j]=dp[i][j*2] dp[i][j]=dp[i][j∗2]相当于将已有的空白叶子节点翻倍.
(如图, 6 6 6左边的作废,变成加了两个新的)
想要 d p dp dp值最小,只需要将 a [ i ] a[i] a[i]合并果子,求出哈夫曼树权即可.
一些总结
不要被卡知识点要及时复习!