题意:给出 $n$ 棵树的高度,砍第 $i$ 棵树的花费是 $h_i+h_{i-1}+h_{i+1}$,求有多少种方案能使得砍完所有树的总代价最小。
砍一棵树的代价只与相邻的树高度有关。下面研究砍 $h_i$ 与 $h_{i+1}$ 的先后顺序对答案的影响。
- 先砍 $h_i$ 后砍 $h_{i+1}$:$h_i+h_{i-1}+h_{i+1}+h_{i+1}+h_{i+2}$
- 先砍 $h_{i+1}$ 后砍 $h_i$:$h_{i+1}+h_i+h_{i+2}+h_i+h_{i-1}$
作差后得到:$h_{i+1}-h_i$。当 $h_{i+1}>h_i$ 时,应该先砍 $h_{i+1}$。当 $h_{i+1}<h_i$ 时,应该先砍 $h_i$。因此,对于相邻的两棵树,先砍高的那棵最优。
插入 DP(insertion DP):先考虑排好前 $i-1$ 个数,再往中间插入第 $i$ 个数。
令 $\mathit{f}_{i,j}$ 表示排好了前 $i$ 棵树的砍树次序,且第 $i$ 棵树排在第 $j$ 位,得到最小代价的方案数。
当 $h_{i+1} > h_i$ 时,应先砍 $i+1$,那么 $\mathit{f}{i+1,j} = \sum{k=j}^{i}\mathit{f}_{i,k}$
当 $h_i > h_{i+1}$ 时,应先砍 $i$,那么 $\mathit{f}{i+1,j} = \sum{k=1}^{j-1}\mathit{f}_{i,k}$
当 $h_i = h_{i+1}$ 时,砍哪棵都可以,$\mathit{f}{i+1,j} = \sum{k=1}^i\mathit{f}_{i,k}$
可以用前缀和优化 DP,$O(n^2)$。
弱智错误!:减法忘记加 MOD。
|
|
Thanks to ABC 209 F - Deforestation - hzy0227