这是求最大子数组的问题,编码不难,有穷举、分治、动态规划三种方法。引起我兴趣的是分治的子问题划分和动态规划的最优子结构的证明。
分治:
从数组的中间分开,最大子数组出现的三种情况:
1、在左半部分
2、在右半部分
3、跨越中点(求跨越中点的子数组等价于求从中间元素开始往左累加的最大值 + 从中间元素开始往右累加的最大值)
动态规划:
对于所有数组元素进行划分,如果加上该元素之前temp>0且temp+a[i]<0,那么该元素a[i]是一个边界,这样,数组会形成好多段,每段结束元素都满足temp>0且temp+a[i]<0.所以我们能得到多个划分块a[p..q],每个划分快的和是负值,划分块有这样的性质,对任意p<=i<q,显然,sum(a[p..i])>=0且sum(a[i..q])<0;根据划分块性质,容易证明,只要子数组横跨多个划分快,其求和值必定小于某个单独的划 分快中的数组求和。