题目:
输入一个整数数组,数组里有正数也有负数。求所有子数组的和的最大值。
思路:
方法很多,这里讲两种
1、举例分析数组的规律。
2、动态规划。
代码:
#include <iostream>
#include <vector>
using namespace std;
//功能:连续子数组的最大和
int FindGreatestSumOfSubArray(vector<int> num)
{
int len = num.size();
int result = INT_MIN;
int preSum = 0;
for(int i = 0 ; i < len ; i++)
{
preSum = max(preSum + num[i] , num[i]);
result = max(result , preSum);
}
return result;
}
//动态规划法
int FindGreatestSumOfSubArrayDP(vector<int> num)
{
int len = num.size();
if(len < 1)
return -1;
int result = INT_MIN;
vector<int> f(len , 0);//f[i]为以num[i]数字为结尾的子数组的最大和,如果f[i-1]<0,则f[i] = num[i],否则+num[i]
f[0] = num[0];
for(int i = 1 ; i < len ; i++)
{
if(f[i-1] <= 0)
f[i] = num[i];
else
f[i] = f[i-1] + num[i];
result = max(result , f[i]);
}
return result;
}
int main()
{
int num[] = { 1 , -2 , 3 , 10 , -4 , 7 , 2 , -5};
int len = sizeof(num) / sizeof(*num);
vector<int> data(num , num + len);
int sum = FindGreatestSumOfSubArray(data);
cout<<sum<<endl;
cout<<FindGreatestSumOfSubArrayDP(data)<<endl;
return 0;
}