题目:给定长度为n的整数序列,a[1…n], 求[1,n]某个子区间[i , j]使得a[i]+…+a[j]和最大.或者求出最大的这个和.例如(-2,11,-4,13,-5,2)的最大子段和为20,所求子区间为[2,4].
- 令b[j]表示以位置 j 为终点的所有子区间中和最大的一个
- 子问题:如j为终点的最大子区间包含了位置j-1,则以j-1为终点的最大子区间必然包括在其中
- 如果b[j-1] >0, 那么显然b[j] = b[j-1] + a[j],用之前最大的一个加上a[j]即可,因为a[j]必须包含
- 如果b[j-1]<=0,那么b[j] = a[j] ,因为既然最大,前面的负数必然不能使你更大
#include <iostream>
using namespace std;
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;
}
int main(int argc, char const *argv[])
{
int n;
cin >> n;
int arr[n];
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
cout << MaxSum(n, arr);