【刷题笔记】CF1082F Speed Dial
【刷题笔记】CF1082F Speed Dial
题解
首先根据题目意思,按键绑定的号码一定是某几个 字符串的前缀。
所以我们可以先建一棵 Trie,Trie 的点权是以当前这个 节点为结尾的电话号码所被拨打得次数。
于是问题转化为了从 Trie 上选取 \(k\) 个点,使得 \(\sum w_i\times d_i\) 最小,其中 \(w_i\) 是第 \(i\) 个点的点权,\(d_i\) 是第 \(i\) 个点到距离它最近的被选取的祖先。
考虑 DP 转移。
如果只是设 \(f_{i,j}\) 表示 \(i\) 的子树中选取了 \(j\) 个点,那么就会发现很难计算新选的点对子树中答案的影响,于是 新增加一维,设 \(f_{i,j,k}\) 表示 \(i\) 的子树中选取了 \(j\) 个点,距离 \(i\) 为 \(k\) 的祖先也被选了(这个祖先是不被包括在 \(j\) 个点内的,除非 \(k=0\))。这有点类似于提前算贡献。
容易写出 DP 方程
\[f_{u,j,k} = \min(f_{u,j-x,k}+f_{v,x,k+1})
\]
但是还有几点需要注意,由于 \(k \ge 0\),所以 \(k+1\ge 1\),但是实际上 \(k+1\) 是可以为 \(0\) 的,所以 DP 方程应该为
\[f_{u,j,k} = \min(f_{u,j-x,k}+\min(f_{v,x,k+1},f_{v,x,0}))
\]
同时若 \(k=0\),则要保证 \(j-x\ge 1\),其余情况下\(j-x\ge 0\)。

浙公网安备 33010602011771号