最大连续子序列问题

最大连续子序列

之前讨论过该问题的一种分治算法,这里讨论基于另一种划分子问题策略的DP算法。设原数组\(L=[i_0,i_1,…,i_n]\),函数\(F(k)\)为“\(L\)中以\(i_k\)结尾的全部连续子数组的元素值之和中的最大值”,则\(F(k)\)满足方程“\(F(k+1) = max\{ F(k) + L[k+1], L[k+1] \}\),且\(F(0)=L[0]\)”。若解出\(F(0),F(1),..,F(n)\),求出其中最大值即得原问题的解。该求解过程的编程实现通常是这样,先定义数组\(F[k]\)表示\(F(k)\),从\(F[0]\)开始自低向高以数组递推并记录\(F[k]\)所有值,最后求数组\(F[k]\)的最大值即为解。算法代价为\(O(n)\)。

上述分析与解决问题的方法就是动态规划,其中关于\(F(k)\)的方程被称为动态规划的状态转移方程。该动态规划算法的代码既简短也易理解,但其实该问题本身并不特别简单,最大子数组问题最早于1977年提出,但直到1984年才被卡内基梅隆大学的教授Jay Kadane发现\(O(n)\)代价的最优算法,Kadane算法在上述动态规划的基础上进一步利用贪心策略把空间代价降为\(O(1)\),因为该问题的状态转移不需要缓存整个\(F[k]\)。

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部