Kadane算法理解(最大连续子数组和的问题)

例题

PAT 1007 Maximum Subsequence Sum

Kadane算法理解

这个算法有点DP的味道但是又没那么难,毕竟有一个连续的限制在这里

为了方便理解,我用一个故事来解释:

背景

1.你是一个商人,获取最大的利润为首要任务
2.有一串连续的商品,每个商品的选择都会让你赚钱或者亏损(正代表盈利,负代表亏损)
3.你只能选择连续的一串商品

开始选择

拿到一串商品,一般先想到固定头部,然后尾部慢慢向后找

遇到了正的商品我们当然选择进来,因为不会亏损

遇到了负的商品,我们有这样的选择:
1.丢弃原来一串商品,重新开始连续地选择的商品
2.继续选择这个会让我们亏损的商品

你如果选择第一个,那这种情况就忽视掉了:
3 7 -1 9 10

也就是说,某个商品可能会让我们有暂时的亏损,但是选择了这个商品,可能给我们后面带来更大的利润。

那么关键的问题在于,我们什么时候应该放弃掉原来手中持有的商品呢?

答: 当手中持有的商品为负数的情况

解释:当你手中这一串商品的和都是亏损状态的时候,你如果还不丢掉,后面的商品就算能盈利,也要抵扣掉你这部分亏损的商品,那还不如丢掉然后重新选择。

总结的来说:
如果手中的商品还能盈利,就继续保持,好处在于能继续选择后面的商品,也许能带来更大的利润,
一旦手中的商品是亏损状态,那就丢弃掉。

如果用代码实现,就是用几个变量来做一个维护的目的就好(如果是第一次,先自己尝试去做,然后再看代码,不然心态会很浮躁的):

//
//  main.cpp
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值