看到k这么大,我的思维立刻就往什么dp+矩乘或者是倍增上走
dp+矩乘看上去挺靠谱的,但是题目要求任意时刻权值非负,那么就得再加一维来控制当前的权值,而当前权值的范围是很大的,这样会超时
于是考虑仔细观察此题的性质
我们可以设想:如果 k→inf k → i n f 那么我一定会想办法走到这个序列的最长子串上然后来回摆动
然而并不是能一下子走到最长子串上的,如果中间有一个比较大的负数,那我就要在它之前的一个区间内来回摆动,直到我的和积蓄到超过这个负数的绝对值,我就能跨过去,前往下一个和更大的区间
所以我的路线一定是长成这样的
我们称一个不停的往返的区间为一个块,那么我们可以发现一个性质,这些块的权值一定是从左向右递增的,否则我就可以留在左边的块不向右走
这个性质就带来了一个另一个很好的性质:我一定会在前面“浪费”尽可能少的步数,因为走到后面之后我的收获更多,也就是说,一旦我的权值能够到下一个区间我就会立刻过去,不会再在当前的小区间上停留
所以我们可以看出,步数是第一关键字,步数相同的情况下权值和是第二关键字
考虑dp,dp1[i]表示走到以i结尾的块所需要的最少步数,dp2[
TopCoder SRM450C: RowGame 题解
最新推荐文章于 2021-12-23 22:58:12 发布