作者: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”为例给出相应的代码。
分享到:
相关推荐
用动态规划法求解最大字段和问题,DEV C++环境运行,测试可用可进行多组数据测试
最大子段和问题,可参考《算法设计与分析》讲义中关于用动态规划策略求解最大子段和问题的思想设计动态规划算法。本算法用户需要输入元素个数n,及n个整数。程序应该给出良好的用户界面,输出最大子段相关信息,包括...
用动态规划法求解最大子段和问题 C语言实现
最大子段和问题的动态规划求解最大子段和问题的动态规划求解最大子段和问题的动态规划求解最大子段和问题的动态规划求解
动态规划求解矩阵数乘问题,使得运行速度最快
计算机算法设计与分析动态规划法求解0-1背包问题的改进算法完整解释
蛮力法、分治法和动态规划法设计最大子段和问题的算法,一、试分别利用蛮力法、分治法和动态规划法求解最大子段和问题,要求写出C/C++程序实现和算法的效率分析。程序运行结果要同时给出最大子段和的值以及由哪个子段...
利用动态规划法求解0-1背包问题,重复背包问题。思路清晰,有参考价值!
最近对问题 最大子段和(分治法) 最长公共子序列问题 最大子段和(动态规划)
lingo是求解最优问题的有效软件,不仅可以求一般的线性规划和非线性规划,还可以求无目标函数的动态规划问题,该论文给出了求解代码!
Matlab求解动态规划问题,以具体的生产存货为问题背景为例
01背包问题动态规划,动态规划求解找零问题和背包问题C++代码
活动安排问题的动态规划、贪心算法和树搜索算法求解。 比如有一个多媒体教室,现在有四个待举办活动A、B、C、D。A是在8:00到10:00举行,简单记为[8, 10];B是[12, 14];C是[15, 17];D是[11, 19]。为了让尽可能多的...
经典算法问题-TSP商旅问题(Traveling Salesman Problem),它是数学领域中著名问题之一。...代码包含遗传算法和动态规划来求解这个问题,里面有完整源代码,并且有详细注释,还有两者的比较分析。
动态规划求解并输出所有LCS
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干子问题,先求解子问题,然后从这些子问题的解求得原问题的解。与分治法不同的是,适合于动态规划法求解的问题,经分解求得的子问题往往不是互相独立...
动态规划求解最长公共子序列问题 动态规划求解最长公共子序列问题 动态规划求解最长公共子序列问题 动态规划求解最长公共子序列问题
如题,动态规划法求解0-1背包问题实验报告 大二算法作业 使用java语言实现 内容框架:问题描述 思路分析 实例分析 实验原码及运行结果 实验心得
关于动态规划最短路径求解的matlab学习例子