这是带变更次数上限的多天算力规划 DP。
第 i 天实例数 x 须满足 x≥load[i]。相对前一天 p(第 0 天前 p=0)的费用为
x⋅runCost+∣x−p∣⋅changeCost且整个规划中 x=p 的天数至多为 maxChanges。
云平台要规划未来 n 天每天开启多少算力实例。
第 i 天(从 0 开始)的最低需求是 load[i],当天实际开启的实例数记为 xi,必须满足:
xi≥load[i]约定:第 0 天之前实例数为 x−1=0(尚未开启任何实例)。
第 i 天费用由两部分相加:
总费用为这 n 天费用之和。
「变更」按天计数,与伸缩幅度无关:
整个规划中变更总次数不得超过 maxChanges。因此第 0 天若 x0=0,也会占用 1 次变更额度。
在「每天满足最低需求」且「变更次数 ≤maxChanges」的前提下,求总费用的最小值。输入保证至少有一种合法方案。
请实现:
minComputeCost(load: int[], runCost: int, changeCost: int, maxChanges: int) -> int
四行:
loadrunCostchangeCostmaxChanges约束:
一个整数:最小总费用。
输入:
[1, 3, 2]
5
2
3
输出:
38
说明:取 x=(1,3,2),变更 3 次。
| 天 | x | 相对前一天 | 运行费 | 伸缩费 | 小计 |
|---|---|---|---|---|---|
| 0 | 1 | 0→1 | 5 | 2 | 7 |
| 1 | 3 | 1→3 | 15 | 4 | 19 |
| 2 | 3→2 | 10 | 2 | 12 | |
总费用 7+19+12=38。
输入:
[1, 3, 2]
5
2
1
输出:
51
说明:maxChanges=1,不能天天改。最优是第 0 天一次拉到 3,之后保持 3,3,3(仅变更 1 次):
| 天 | x | 相对前一天 | 运行费 | 伸缩费 | 小计 |
|---|---|---|---|---|---|
| 0 | 3 | 0→3(计 1 次变更) | 15 | 6 | 21 |
| 1 | 不变 | 0 | 15 | ||
| 2 |
总费用 21+15+15=51。
输入:
[2, 2, 2]
3
1
1
输出:
20
说明:取 x=(2,2,2)。仅第 0 天 0→2 计 1 次变更;运行费 2×3×3=18,伸缩费 2,合计 20。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.