POJ - 3017 Cut the Sequence (单调栈优化dp)

Cut the Sequence

 POJ - 3017 

题目大意:给出一个序列,要我们分成若干段,使得每段的最大值做和最小。同时还给了一个限制,每段的和不能超过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进入。(实际过

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值