最大m子段和动态规划_动态规划解决最大连续子序列问题

先给出题目图片:

2a2f685657f2761e3126ace109b8618e.png

简要描述一下题目就是:给出一串数字序列,让你在里面找一串相连的数字,它们的和是所有相连的数字中最大的。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231

这个问题怎么解决呢?当然你可以枚举,找出所有的子序列,把每个子序列的和都算一遍,在找到里面最大的。这方法是可行的,但缺陷是时间复杂度太大。

现在我们讲讲用动态规划的思路:

先给出一串数字 : -9 1 -5 4 3 -6 7 8 -2

思路:用DP[i]表示以第i个元素(记为A[i])为结尾的连续子序列的最大值。(注意一定是以第i个元素为结尾,这个理解错了就不能理解整个算法思路)。

然后当DP[i-1] <0 时 DP[i] = A[i] ,

当DP[i-1]>=0时 DP[i] = DP[i-1] + A[i] 。

一句代码描述就是:DP[i] = ( DP[i-1]>=0 ? DP[i-1]+A[i] : A[i] )

然后DP【0】表示没有数字,故DP【0】 = 0 ;

有了递归方程就可以计算了。

根据上诉思路求出数字串 : -9 1 -5 4 3 -6 7 8 -2 各个位置的DP[i]

DP【0】 = 0 ;

DP【1】 = A[1] + DP[0] = -9 ; // DP[0] = 0

DP【2】= A[2] = 1 ; // DP【1】=-9< 0

DP【3】= DP[2] + A【3】 = -4 ; // DP【2】= 1 >0

DP[4] = A[4] = 4 ; // DP【3】 = -4 <0

....

....

写出所有DP[i]如下图:

e717a116acc3c8fd3fbe263e5ce5bb07.png

找出DP【i】中最大为16 ,故上诉数字最大连续子序列的和为16.

且知道是由4 3 -6 7 8 组成。

最后解释一下DP【i】为什么是以A[i] 为结尾的连续子序列呢?

这是因为如果结尾不是A[i]的话,在考虑是否加进A[i+1]的时候就不能保持连续的性质了。这是理解这个思路比较重要的点。理解了这个这个算法也就不难理解了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值