最大子段和是一个学习动态规划必学的问题,也是最基础的动态规划问题。
例题
洛谷1115 最大子段和
题目描述:
给出一段序列,选出其中连续且非空的一段使得这段和最大。
输入格式:
第一行:是一个正整数N,表示了序列的长度。
第二行:包含N个整数num[i],描述了这段序列。
输出格式:
一个整数,为最大的子段和是多少。
输入样例:
7
2 -4 3 -1 2 -4 3
输出样例:
4
最大子段和
对于最大子段和这个问题,其实我们发现如果说序列中所有的数都是正数,那么最大子段和一定是所有数的和,但为什么有时候不是呢?这就是负数捣的鬼。那么怎么解决负数呢?这就要用到动态规划了,提到DP,就一定就要去想:状态、转移方程、初值和答案了。
- 状态:dp[i]指在a[1] ~ a[i]这i个数中,结尾必须为a[i]这个数的最大子段和。
- 转移方程:dp[i] = max(0, dp[i - 1]) + a[i];
其实这个的意思就是:如果说dp[i - 1]小于0,具体些就是以a[i - 1]这个数为结尾的最大子段和小于0的话,那么还不如说就不要前面