给定由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