之前有一个博客说的是使用分治的方式处理问题,但是我们可以看到实际上是将问题复杂化了。
链接:最大子数组问题
动态规划
dp说白了就是一个个的不断尝试,来找到问题的最优解,那么动态规划就应该有一个状态转移方程,我们来看看这道题用动态规划能不能解决?
算法导论还是很良心的,至少给了我们以下的思路:
使用如下思想为最大子数组问题设计一个非递归的、线性时间的算法。从数组的左边界开始,从左至右处理,记录到目前为止已经处理过的最大子数组。若已知A[1…j]的最大子数组,基于如下性质将解扩展为A[1…j+1]的最大子数组:A[1…j+1]的最大子数组要么是A[1…j]的最大子数组,要么是某个子数组A[i…j+1]> (1≤i≤j+1)。在已知A[1…j]的最大子数组的情况下,可以在线性时间内找出形如A[i…j+1]的最大子数组。
先看看这句话什么意思吧。
我们已经有了一个[1……j]的最大子数组,那么在此基础上我们就可以求出A[1……j+1]的最大子数组,只可能有两种情况:还是原来的,或者是舍弃前面的一部分,A[i……j+1]。(这部分比较直观)
然后就是线性时间求[i……j+1],这个就是一个个的遍历找到i。
如果我们给出的dp数组的定义是这样的dp[i] = A[1……i]最大子数组的值,那么写递推方程会变成这样:
dp[j+1] = max{