题目
分析给定一个数组A[0,...,n-1],求A的连续子数组,使得孩子数组的和最大。
例如数组:1,-2,3,10,-4,7,2,-5的最大子数组是:3,10,-4,7,2
记S[i]为以A[i]为结尾的数组中和最大的子数组
则:S[i+1]=max(S[i]+A[i+1],A[i+1])
S[0]=A[0]
遍历i:0<=i<=n-1
动态规划:最优子问题
时间复杂度:O(n)
#include "stdafx.h"
#include <iostream>
#include <list>
int MaxSubarray(const int* a, int size)
{
if (!a || size <= 0)
return 0;
int sum = a[0]; // 当前子串的和
int result = sum; // 当前找到的最优解
for (int i = 1; i < size; i++)
{
if (sum > 0)
{
sum += a[i];
}
else
{
sum = a[i];
}
result = (sum > result) ? sum : result;
}
return result;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[] = {1,-2,3,10,-4,7,2,-5};
int m = MaxSubarray(a, sizeof(a)/sizeof(int));
std::cout<<m<<'\n';
system("pause");
return 0;
}