1 条题解
-
0
题解
思路
把已经获得的块数超过 的状态统一截断为 。若当前还需要把块数再扩大到原来的 倍,沿新维度切成 份后,新的需求为 ,体积倍率为 。
子任务 1
枚举每一维的 ,在叶子检查乘积是否至少为 ,直接计算目标值。复杂度为 。
子任务 2
令
dp[j]表示处理若干维后恰好得到min(实际块数,k)=j时的最大目标值前缀。对每个有效 枚举切分数 ,当 时正常转移;达到 后只需考虑最小的 。利用调和级数,单维转移为 。子任务 3
改用“剩余倍率”状态。所有 只有 个不同值。对于一个剩余倍率 ,其转移目标 同样只有 个不同值;对每段只保留最小 ,因为它让 最大。
依次生成商相同区间的左端点:当前值为 时,下一个左端点为 。预处理所有压缩状态及转移后进行滚动 DP。
做法
- 枚举并编号全部不同的 。
- 对每个压缩状态生成所有不同目标状态及对应的最小切分数 。
- 初始剩余倍率为 ,初始数值为 。
- 逐维乘上 并取最大值,最终读取剩余倍率为 的状态。
正确性证明
状态 精确表示当前仍需把块数扩大至少 倍;选择 后新需求为 ,因此转移无误。对产生同一新需求的多个 ,较小的 具有不小的 ,所以只保留区间左端点不丢失最优解。DP 枚举每一维的全部不同有效决策,最终 恰表示总块数至少为 ,故答案正确。
复杂度
满分算法时间复杂度为 ,空间复杂度为 的预处理转移与滚动状态;实现中 DP 本身为 空间。中档为 ,小档为指数复杂度。
- 1
信息
- ID
- 1367
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者