给定一个序列a1,a2,...,an,求子序列中和最大的那个。如果使用暴力算法,需要使用O(n2)的时间复杂度。使用动态规划可以将时间复杂度下降到O(n),具体方法如下:
定义bi为以ai结尾的所有序列中最大值,显然max{b1,b2,b3,...,bn}就是子序列和的最大值,bi满足关系式
b1=a1
bi=max{bi-1+ai, ai}
通过这个关系式,可以在O(n)的时间内把所有bi求出来,然后求最大值就可以了。注意到bi只有在求bi+1以及求最大值的时候才用到,我们也可以把这两个过程合并起来。维护一个当前子序列和最大值,如果bi比最大值还大,则更新最大值,这样数组bi实际上也不需要了。