1.问题描述:
最大子段和是一个经典的DP问题。
比如给定一个序列: 2, -1 , 3 , -5 , 3
可以推测出最大子段和为 2 - 1 + 3 = 4
题目要求输入一段序列,输出最大的子段和。
2.算法分析:
什么是子段和?
就是在整个序列的子区间中最大的和。
我们首先要找到这个问题的状态转移方程。
如何设计状态?
我们可以发现一个问题,我们可以将每一个子区间的和算出来。
比如我们使用dp[i] 表示 从1 - i的子段和。
那么状态 i 该怎么来。
可以发现它可以合并之前的dp[i - 1],也可以重新开始作为区间的起始端点。
所以可以写出状态转移方程:
dp[i] = max(dp[i - 1] + a[i],a[i])
dp[i - 1] + a[i] 代表的是合并进入区间
a[i]代表结束之前的区间,另起炉灶。
DP的关键就是寻找状态转移方程,如何设计状态,如何设计转移。
本人也刚入门,大家一起学习。
3.源代码:
#include <iostream>
#include