1 条题解
-
0
题解
思路
每个位置相互独立。先求从 变到每个 所需的最少操作数 。当当前值为 时,枚举正整数参数后只会得到 ;按数值递增松弛这些转移即可得到最短步数。
随后每个位置成为一个物品:选择它需要 次操作,收益为 。总操作数不超过 , 问题变为零一背包。所有 的最短步数都很小,因此容量可截断为所有物品代价之和, 也就是至多约 。
做法
全局预处理 。对每组测试把容量设为 ,建立一维背包数组, 依次对每个位置按容量从大到小更新收益,最后输出所有容量状态中的最大值。
正确性证明
预处理枚举了从每个可达值出发的一次合法操作,并按最短路松弛,因此 等于把单个元素从 变为 的最少操作数。
若最终获得位置 的收益,至少需要 次操作;反之,执行对应最短操作序列即可恰好获得它。 不同位置的操作互不影响,所以任意收益方案与一个总代价不超过 的物品子集一一对应。 零一背包枚举并比较了全部这样的子集,故其最大值就是原问题最优收益。
复杂度
最短步数预处理规模为常数。每组背包时间复杂度为 ,空间复杂度为 。
- 1
信息
- ID
- 1103
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者