动态规划——最大连续子序列和

动态规划之——最大连续子序列和(C++实现)

最大连续子序列和,或称为“连续子序列的和的最大值”,是一种动态规划问题,下面来看问题描述

给定一个长度为n数字序列A1, A2, A3······An, 现要求求出一组(i,j),使得:Ai + ······ + Aj 的和最大,输出这个最大和

测试用样例见下

输入:

6
1 -3 5 8 -100 52
4
-2 85 -15 62
5
1 2 -5 6 -9 1

输出:

52
132
6

接下来开始讲解

用双重循环暴力枚举 i,j 靠谱吗?枚举(i,j)需要 O(n²) 的复杂度,计算 Ai + ······ + Aj 需要 O(n) 的复杂度,乘起来是立方阶 O(n³), 令人难以接受

暴力枚举 ,pass !

接下来考虑动态规划的做法,开一个dp数组,以dp[i]来表示以A[i]结尾的最大子序列和(注意是强制以A[i]结尾),那么答案显然就是max(dp[1], dp[2], ······ ,dp[n])了,可是能一目了然的看出来的貌似只有dp[1],它的值显然等于A[1],其他的又该怎么办呢?

在动态规划题目中,能用眼睛看出答案的部分往往是这个问题的边界 ,是状态转移方程的起点,这也是动态规划的妙处所在:以边界处渺小的信息量,通过状态转移方程,逐步推出整个问题的解

一旦确定了状态转移方程和边界,距离AC这道题目就不远了!

而状态转移方程是动态规划问题的绝对核心,类型繁多,甚至往往需要就题论题,掌握它可以说是任重而道远(博主在写这篇博文时也在全身心投入动态规划的学习)

然而本题的状态方程并不复杂,对于dp[i] (i >= 2) 来说,dp[i - 1]的正负直接决定了dp[i]的取值,若dp[i - 1]为正,那么dp[i]就等于A[i]本身加上dp[i - 1],若dp[i - 1]为负,那么dp[i]就等于A[i]本身

更简单的来说,dp[i] = max{ dp[i - 1] + A[i], A[i] }

有了边界和状态转移方程,接下来,上代码!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值