[dp trick] Exact Payment

posted on 2023-11-08 23:53:00 | under 题集 | source

小清新题一道。

思路

题目是要求每一位可能取到的最大值,考虑每位分别计算。

然后可以背包。我们想把 第 \(i\) 位最大值 转化为 数的最大值。结合上面,不难想到状态:\(f_p\) 表示在模 \(10^i\) 意义下,\(p\) 是否存在。那么第 \(i\) 位答案就是 \(\max p/10^{i-1},f_p=true\)

考虑优化这个过程。好像没必要存第 \(i\) 位相等的状态太多次。刚好有个 trick:

  • 对于状态 \(A<B<C,C-A\le 10^{i-1}\)。则 \(B\) 对答案的所有可能贡献都会被 \(A,C\) 取到。

证明参自 Lgx_Q:考虑后面取的和为 \(v\),则 \((C+v)-(A+v) \le 10^{i-1}\),这等价于模后两数的最高位差值不超过 \(1\)。故结论成立。

那么每个时刻的合法状态数不超过 \(10\),只需在转移后及时去除冗余状态即可。

那每一位的求解就是 \(O(10n)\) 的。总体复杂度 \(O(n\log_{10} V)\)\(10\) 的常数。

posted @ 2026-01-12 19:59  Zwi  阅读(1)  评论(0)    收藏  举报