码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划--最大子段和

时间:2015-06-15 18:30:07      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:

给定由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 }
View Code


构造最优值:

技术分享
 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 } 
View Code

 

 
 
 
 
 
 
 
 
 
 

动态规划--最大子段和

标签:

原文地址:http://www.cnblogs.com/acm1314/p/4578577.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!