算法:最大子段和

最大子段和是动态规划的经典问题,当序列包含负数时,需要通过状态转移方程来求解。状态dp[i]表示以a[i]结尾的最大子段和,转移方程为dp[i] = max(0, dp[i - 1]) + a[i]。初值dp[0] = 0,最终答案为max{dp[i]},时间复杂度为O(n)。" 11278011,1346041,SQL Server与Access数据库实现DECODE函数,"['数据库', 'SQL函数', 'Access函数', '数据处理']
摘要由CSDN通过智能技术生成

最大子段和是一个学习动态规划必学的问题,也是最基础的动态规划问题。

例题

洛谷1115 最大子段和

题目描述:
给出一段序列,选出其中连续且非空的一段使得这段和最大。

输入格式:
第一行:是一个正整数N,表示了序列的长度。
第二行:包含N个整数num[i],描述了这段序列。

输出格式:
一个整数,为最大的子段和是多少。

输入样例:

7
2 -4 3 -1 2 -4 3

输出样例:

4

最大子段和

对于最大子段和这个问题,其实我们发现如果说序列中所有的数都是正数,那么最大子段和一定是所有数的和,但为什么有时候不是呢?这就是负数捣的鬼。那么怎么解决负数呢?这就要用到动态规划了,提到DP,就一定就要去想:状态、转移方程、初值和答案了。

  1. 状态:dp[i]指在a[1] ~ a[i]这i个数中,结尾必须为a[i]这个数的最大子段和。
  2. 转移方程:dp[i] = max(0, dp[i - 1]) + a[i];
    其实这个的意思就是:如果说dp[i - 1]小于0,具体些就是以a[i - 1]这个数为结尾的最大子段和小于0的话,那么还不如说就不要前面
  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值