2742
- 一定要用paid painter才可以用free的,假设我们在时间
time
上,这意味着我们用了paid,在这段时间里我们可以刷其他墙. - 因为免费的刷墙只用1 unit时间,这意味着
time >= n
一定能刷完所有墙,而我们的目的则是在能刷完的时间内找到最小的cost 然后我就完全没有思路了
题解后
看了题解但觉得自己还是无法自己独立做出来这道题,问题事知道要用time做体积但是无法正确推理,思考问题没有关联性。例如我已经知道了time做体积且(free刷1墙只需1time,总共有n墙),那么最大可能是多少?我直接写了500,不能说不对,但不周全导致后续无法思考。
重新梳理一遍:
付费刷墙数 + 免 费刷墙数 = n
付费时间 + 免费刷墙数 >= n
: 这是正确的推理却不是有效的信息付费时间 >= 免费刷墙数
- 由1,3得到
付费时间 >= n - 付费刷墙数
- 因为
付费时间 =
, 所以我们可以得到新付费时间 =
- 我的思路哪怕跟着题解也卡在了这里,如何使用这
time[i] + 1
暂停在这里仔细回顾条件1,我们要刷完所有墙,而这里的付费刷墙数
和免费刷墙数
都是我们假设的答案。我们基于这个条件结合3得到的5也是我们的前提条件,而原本我们以n
作为体积转换成背包,正好可以用到这个条件。 - 使用01背包做题
错误梳理
让t = time[i] + 1
为什么dpcopy[j + t] = min(dpcopy[j + t], dp[j] + cost[i]);
不对?因为在[0, t]
这个区间根据我们的题意,这时候我们没有使用paid painter所以这里不能用免费的,而我们也必须要刷墙,所以在这个区间内必须用pad painter.