`
huobengle
  • 浏览: 862534 次
文章分类
社区版块
存档分类
最新评论

动态规划求解最大字段和及其变种问题

 
阅读更多

作者:lihao21

版权所有,转载请标明出处。


动态规划(DP)为一常用算法思想,本文讲述如何利用DP解决常见的最大字段和及其变种问题。


一、 最大字段和问题

问题定义

设数组为a[k],1≤k≤n,最大字段和X定义为:


X直观含义即,求任一连续字数组的最大和。

问题分析

不妨设:


b[j]的直观含义为,以a[j]为结束元素的连续数组的最大和。

由X和b[j]的定义,易知:


这也可以理解。设想一下,所求得的连续字数组肯定以某个元素结束,求出所有的“以某个元素结束的连续数组最大和b[j]”,取其最大的b[j],即为X。

下面求b[j]。

(1) 当b[j-1] > 0时,无论a[j]为何值,b[j] = b[j-1] + a[j];

(2)当b[j-1]≤0时,无论a[j]为何值,b[j] = a[j];

例子

k

1

2

3

4

a[k]

3

-4

2

10

b[k]

3

-1

2

12

其中,b[1] = a[1],b[2] = b[1] + a[2],b[3] = a[3],b[4] = b[3] + a[4];因此,对数组a,最大字段和为b[4],即X = 12。

代码


算法时间复杂度为O(n)。


二、最大字段和问题的变种

1.两个不重叠(可相邻)连续字数组的最大和。

问题定义

设数组a[t],1≤t≤n,两个不重叠连续字数组的最大和定义为:


问题分析

应用了求最大字段和的方法。其求解算法如下:

(1)从头到尾扫描一遍数组,其循环下标i从1增加到n,依次求得字数组a[1…i]的最大字段和,将结果保存在maxSum[1…n]数组;

(2)从尾到头扫描一遍数组,其循环下标i从n减小到1,依次求得字数组a[i…n]的最大字段和,将结果保存在rMaxSum[1…n]数组;

(3)从尾到头扫描一遍数组(其实哪个方向无所谓),其循环下标从n-1到1,求和maxSum[i] + rMaxSum[i+1],取最大的结果,即max{ maxSum[i] + rMaxSum[i+1]},1≤i≤n-1,即为所要求的结果。

例子

t

1

2

3

4

a[t]

3

-4

2

10

b[t]

3

-1

2

12

maxSum[t]

3

3

3

12

rb[t]

11

8

12

10

rMaxSum[t]

12

12

12

10

其中,rb数组与b数组的作用类似,只不过rb[j]保存的是“从尾到头方向,以a[j]元素为结束元素的连续数组的和的最大值”。而rMaxSum同样只需根据rb数组即可求出。

代码

以POJ上面2593题“Max Sequence”为例给出相应的代码。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics