专栏文章

题解:P12734 理解

P12734题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@miotj0w6
此快照首次捕获于
2025/12/03 00:54
3 个月前
此快照最后确认于
2025/12/03 00:54
3 个月前
查看原文
本题我们可以先定义一个直接出答案的状态:fu,if_{u,i} 表示以 uu 为根的子树内记忆容量为 ii 的最少时间,特别地,fu,0f_{u,0} 表是以 uu 为根的子树内,不选 uu 的最少时间。
则答案应为 f0,0f_{0,0},所以 fuf_u 应该不记录 uu 的贡献。
对于状态转移,首先有:
fu,1=vson(u)min(fv,0,fv,k+rv)f_{u,1} = \sum_{v \in son(u)} \min(f_{v,0},f_{v,k}+r_v)
\infty & u \in x \\ f_{u,1} & u \notin x \\ \end{cases}$$ 考虑 $i \in [2,k]$,有三种转移情形: 1. $v$ 不选,此时用于转移的是 $f_{v,0}$ 2. $v$ 作为根,此时用于转移的是 $f_{v,k}+r_v$ 3. $v$ 作为 $u$ 的儿子,此时用于转移的是 $f_{v,i-1}+t_u$ 但是,我们发现,对于 $u$ 子树和 $i$ 的记忆容量,$u$ 的儿子中可以有**最多一个**记忆容量为 $k$,其余都为 $k-1$。 这时,我们可以按以下方式处理,就是先算出和再减去 $v$ 的原贡献加上新贡献 ```cpp F(i,2,k){ ll s = 0; for (auto v:go[u]){ s += min(dp[v][0],min(dp[v][k]+ar[v],dp[v][i-1]+br[v])); } dp[u][i] = s; for (auto v:go[u]){ dp[u][i] = min(dp[u][i],s-min(dp[v][0],min(dp[v][k]+ar[v],dp[v][i-1]+br[v]))+min(dp[v][0],min(dp[v][k]+ar[v],dp[v][i]+br[v]))); } } ``` 最后注意一下多测清空

评论

1 条评论,欢迎与作者交流。

正在加载评论...