动态规划--最大子段和

给定由n个整数(包含负整数)组成的序列a1,a2,...,an,求该序列子段和的最大值。

当所有整数均为负值时定义其最大子段和为0。

例如,当(a1,a2, ……a7,a8)=(1,-3, 7,8,-4,12, -10,6)时,
最大子段和为:23

bj是1到j位置的最大子段和:


a1


a2



ai



aj



an-1


an

|《-------bj--------------》|

由bj的定义易知,当bj-1>0时bj=bj-1+aj,否则bj=aj。

则计算bj的动态规划递归式:

bj=max{bj-1+aj,aj},1≤j≤n。


 


1


2


3


4


5


6


a[i]


-2


11


-4


13


-5


-2


b(初值=0)


-2


11


7


20


15


13


sum


0


11


11


20


20


20

求最大值:

 1 #include<iostream>
 2 using namespace std;
 3
 4 int MaxSum(int n)
 5 {
 6     int sum = 0;
 7     int b = 0;
 8     for(int i=1; i<=n; i++)
 9     {
10         if(b>0) b+=a[i]; else b=a[i];
11         if(b>sum) sum = b;
12     }
13     return sum;
14 }
15
16 int main()
17 {
18
19 }

构造最优值:

 1 #include<iostream>
 2 using namespace std;
 3
 4 const int MAXN = 1001;
 5 int a[MAXN];
 6
 7 int MaxSum(int n, int &besti, int &bestj)
 8 {
 9     int sum = 0;
10     int b = 0;
11     int begin = 0;
12     for(int i=1; i<=n; i++)
13     {
14         if(b>0) b+=a[i];
15         else
16         {
17             b=a[i]; begin = i;
18         }
19         if(b>sum)
20         {
21             sum = b;
22             besti = begin;
23             bestj = i;
24         }
25     }
26     return sum;
27 } 

时间: 2024-07-31 04:36:24

动态规划--最大子段和的相关文章

动态规划——最大子段和

一.最大子段和 问题 给定N个数A1, A2, ... An,从中选出k(k不固定)个连续的数字 Ai, Ai+1, ... Ai+k-1,使得∑i+k−1iAt 达到最大,求该最大值. 分析     求最大子段和可以用多种算法来解决. (1)直接枚举 max = 0; for i in [1...n] for j in [i....n] sum = 0; for k in [i...j] sum += A[k] if(sum > max) max = sum //时间复杂度为O(n^3) (2

算法重拾之路——最大子段和

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 第二章:动态规划 >最大子段和< 算法描述: ?给定由n个整数(可能为负整数)组成的序列 a1,a2, ... , an ,求该序列形如  从ai 到 aj (i ≤ j)的子段和的最大值.当所有整数均为负整数时定义其最大值为0.根据这个定义,所求的最优值为:

动态规划(普及组)

入门篇:动态规划思想 动态规划向来都是OI竞赛生涯中的分水岭. 开篇杂谈 文章中有任何地方不懂可联系我$qq:2832853025$,退役前全天在线. 前置技能 DFS搜索. 记忆化搜索. 递推式.(高中必修五数学) 个人理解 照搬定义肯定不是传授知识的好办法,呢只是老师PPT上面爱放的东西. 在我个人的理解中,动态规划只是搜索的一种优化方法,但是并不可以优化所有的搜索.一般的来说,符合下面三条情况的搜索是可以转化为动态规划的思想来做的. 重叠子问题. 最优子结构. 子问题无后效性. 通俗的借用

算法第三章上机实践

1.实践题目 最大子段和 2.问题描述 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整数均为负数时,定义子段和为0. 要求算法的时间复杂度为O(n). 输入格式: 输入有两行: 第一行是n值(1<=n<=10000): 第二行是n个整数. 输出格式: 输出最大子段和. 3.算法描述 int maxsum(int a[],int n) { int sum=0,k=0; for(int i=

HDU 1024 Max Sum Plus Plus【动态规划求最大M子段和详解 】

Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 29942    Accepted Submission(s): 10516 Problem Description Now I think you have got an AC in Ignatius.L's "Max Sum" problem

最大子段和 分治与动态规划

问题:  给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值.当所给的整均为负数时定义子段和为0,依此定义,所求的最优值为:    Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n    例如,当(a1,a2,a3,a4,a4,a6)=(-2,11,-4,13,-5,-2)时,最大子段和为20. 问题求解: 方法一:枚举 学过程序设计的都会,那就是枚举i和j,求i和a[i]

HDOJ-1003 Max Sum(最大连续子段 动态规划)

http://acm.hdu.edu.cn/showproblem.php?pid=1003 给出一个包含n个数字的序列{a1,a2,..,ai,..,an},-1000<=ai<=1000 求最大连续子段和及其起始位置和终止位置,很基础的动态规划(DP)问题,看完DP第一次做的DP题目 DP真的是一种很优美的算法,或者说思想,但是比较难理解,我对DP的理解还很浅薄 # include <stdio.h> # define INF 1000000000 int main() { i

最大m子段和问题 Max Sum Plus Plus —— 动态规划

"最大m子段和" 问题 Max Sum Plus Plus 问题描述: 给定由n个整数(可能为负数)组成的序列a1,a2,a3--an,以及一个正整数m,要求确定此序列的m个不相交子段的总和达到最大.最大子段和问题是最大m字段和问题当m=1时的特殊情形. OJ题目源地址: http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    M

[ACM] POJ 2479 Maximum sum (动态规划求不相交的两段子段和的最大值)

Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33363   Accepted: 10330 Description Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below: Your task is to calculate d(A). Input The input consists o