Cut the Sequence
题目大意:给出一个序列,要我们分成若干段,使得每段的最大值做和最小。同时还给了一个限制,每段的和不能超过m。
解题思路:这个题目写起来还真的是细节满满。。。。
首先可以得到n^2的dp。
设dp[i]为前i个满足要求的最小值。
那么对于i.
dp[i]=min(dp[j],max(j+1,i)) 其中(0<=j&&j<=i &&sum[i]-sum[j]<=m )
其实这个dp方程可以用单调栈来优化。。
容易发现,dp数组是递增的(不严格)。而对于一个固定的i ,Max(j,i)是递减的(不严格)。
以样例为例
8 17 2 2 2 8 1 8 2 1
利用单调栈我们可以减少枚举的状态。比如 我们知道4到7的最大值为6。
因为dp数组是单调的,所以我们知道dp[3]肯定是最优的。而max(4,7),max(5,7),max(6,7)又相等。
所以我们在用单调栈维护区间最大值的时候能够减少枚举的状态。
但是,单调栈到底维护的是什么?
举个例子: 8 1 8 2 1
对于这几个数来说。
刚开始8进入,1进入
然后8,1出去 8进入
然后2 1进入。(实际过