换一个角度考虑问题,即我们可以把这个看起来有点复杂的规划问题转换成“填小孩”这里用词是不是有点不当的问题,即在奖牌形态固定的情况下,每个小孩在第 i 天 escape 的代价为 b1+b2+⋯+bi−1+(bi+ci)。看起来似乎可以动态规划。这里的 i 个加项分别依次对应第 1 天到第 i 天的代价。注意这里第 j 天的奖牌第 j 天到第 n 天都能使用,所以要加一维奖牌数。
那么现在我们梳理一下 dp 维度,天数一维,小孩总数一维,小孩结束个数一维,转移一维,奖牌一维,哇似乎是五维的,把奖牌一维固定下来即维护每个状态最小消耗奖牌数也是四维的,这也太不好做了。唉,正难则反嘛,我们倒过来遍历,对于结束个数和总数就可以当做是同一维度的了。即,当前只需要知道第 i 天及以后结束的小朋友个数,对于前面结束的小朋友是之后遍历的内容,暂时不用管。那么就可以消掉一维啦!
现在得到一个状态 O(n2) ,时间 O(n3) 的做法,对于 fi,j 表示第 i 天以后共有 j 个小朋友 escape,还需要从前 i−1 天里面借的最少奖牌数。注意转移的时候第 i 天可能有若干个小朋友结束,所以时间多了一维。
我们发现这就是个最优化取 k 物品价值和问题,不难证明 fi 函数是单调递增且下凸的。所以我们考虑 slope trick。先推导出题目条件和约束:
如果第 i 天以后共有 j 个小朋友 escape,那么前 i−1 天剩下留到后面的奖牌数至少是 j∑1≤p<i−1ap 块。这个信息是最重要的,也是奖牌数个数限制的充要条件。