Loading [MathJax]/jax/output/HTML-CSS/jax.js

我水平很菜,你忍一下。

题面

树形 DP。

首先可以发现, m>2 时,难受度只出现在最大的头吃的果子上(因为我把果子分成最大的头吃的和其他的,其他的里面,相邻的果子让不同的头吃即可)。

然后我定义 fi,j,k 为当前为 i 节点,当前节点分 j 个果子给最大的头,当前节点选择情况为 k10 不选)。

那么对于每一个子节点,我们有
fu,j,0=min{min{fv,t,0+fu,jt,0+[m=2]wi,fv,t,1+fu,jt,0}},fu,j,1=min{min{fv,t,1+fu,jt,1+wi,fv,t,0+fu,jt,1}}

解释:
当我当前节点不给最大头,那么 fu,jt 的第三项只能取 0 ,同理,如果我当前节点不给最大头吃,那么 fu,jt 的第三项只能取 1

如果 m=2 ,那么当我当前节点和当前节点的子节点全部取 0 时,就是说这两个点都给第二个头吃,那么答案要加上 wi ,否则不用(前面说过了)。

然后如果我当前节点和子节点全部给大头,那么这中间这段树枝必须加到答案里。

但是,这样做会导致更新过的 f 再去更新别的 f ,所以我们要把用来更新的 f 拍到另一个数组 g 中,则:
fu,j,0=min{min{fv,t,0+gjt,0+[m=2]wi,fv,t,1+gjt,0}},fu,j,1=min{min{fv,t,1+gjt,1+wi,fv,t,0+gjt,1}}

这样方程就写完了。

另外,如果果子个数不够,那么答案就是 1

最终输出的答案就是 f1,k,1 ,因为规定第一个点必须选。

代码

分类: 文章

Flyic

菜.

0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注