和最大的连续子数组-动态规划理解
题目要求
给定一个整数数组,包含正负数且无序,找出和最大的连续子数组,比如数组[1,1,-5,6,7,-2],则和最大的子数组为[6,7],最大和为13。
动态方程
看过题解的都知道,这个题目的动态方程为:
max( dp[ i ] ) = getMax( max( dp[ i -1 ] ) + arr[ i ] ,arr[ i ] )
意思是,以下标为i元素结尾的子串的最大和子串为:上一个这样的结果与arr[i]的和 跟arr[i]当中的最大值。但以我的理解能力才开始没看懂这个方程是怎么来的,也没有理解它的意义何在。
经过分析得出以下结论:
- 子数组可能以数组中的任何一个元素结尾。
- 以上一个元素结尾的子串和当前的元素是连续的。
- 以当前元素结尾的和最大子数组要么加上以上一个元素结尾的最大和子数组,
要么以本元素作为最大子串。 - 可以找到以每个元素结尾的子数组的最大子数组和。
有了以上条件,就可以想到动态规划的原理了:
首先,第一个元素以它本身结尾,它也是一个子串,所以 以这个元素结尾的子串就是它本身,第二个元素要想找到以自身结尾的和最大的子串就得比较:本身 和 与上一个最大子串和的和(因为上一个最大子串是和当前元素连续的,可以直接利用它的结果,如果与上一个最大子串和相加比自身还小,那么以这个元