问题描述:
给定一个数组,记录一串数字,可正可负,现要求出其中最大的连续子段和。
用数组A[N]记录所要求的数组,用数组B[N]来记录连续子段和的状态
通过分析,可以知道:
当B[K]>0时,无论B[K]为何值,B[K]=B[K-1]+A[K]
当B[K]<0时,也就是B[K]记录到一个A[J]是负的,可以把B[K]变成负的,那么B[J]记录的这一段应该截掉,应为无论后面的A[K]多大,加上个负数总不可能是最大的子段和,因此将B[K]=A[K],重新开始记录。
故动态转移方程便可得出
B[K] = MAX(B[K-1]+A[K] , A[K])
看个实例
k 1 2 3 4
a[k] 3 -4 2 10
b[k] 3 -1 2 12
#include "stdafx.h"
#include <iostream>
using namespace std;
int MaxSum(int n, int *a);
int main()
{
int a[] = { -2, 11, -9, 13, -5, -2 };
for (int i = 0; i<6; i++)
{
cout << a[i] << " ";
}
cout << endl;
cout << "数组a的最大连续子段和为:" << MaxSum(6, a) << endl;
system("pause");
return 0;
}
int MaxSum(int n, int *a)
{
int sum = 0, b = 0;
for (int i = 0; i < n; i++)
{
if (b>0)
{
b += a[i];
}
else
{
b = a[i];
}
if (b>sum)
{
sum = b;
}
}
return sum;
}