题目描述:输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n).
1. 分析
典型的动态规划:
- 设定状态 dp[i] :以i为结尾索引的最大子数组和;
- 寻找关系:既然是连续序列,那么问题是当前元素选不选呢?是不选,直接前面的就是最大子序和,选的话,那么要放弃前面所有的元素,从当前元素开始。至于选不选的标准,当然是哪个大就选择哪个。
- 设定初值:当只有一个元素,那么最大的子序和就是第一个元素。
2. 用C++写出逻辑
int FindGreatestSumOfSubArray(vector<int> array) {
// dp[i]:以i为结尾索引的最大子数组和;
int n = array.size();
if(n == 0)
return -1;
int dp[n];
dp[0] = array[0];
int maxdp = dp[0];
for(int i = 1; i < n; ++i){
dp[i] = max(dp[i - 1] + array[i], array[i]);
if(dp[i] > maxdp)
maxdp = dp[i];
}
return maxdp;
}