题目:
给定一个整数数组,找出两个不重叠子数组使得它们的和最大。
每个子数组的数字在数组中的位置应该是连续的。
返回最大的和。
注意:子数组最少包含一个数
样例:
给出数组 [1, 3, -1, 2, -1, 2]
这两个子数组分别为 [1, 3] 和 [2, -1, 2] 或者 [1, 3, -1, 2] 和 [2],它们的最大和都是 7
思路:
动态规划的思想,先从左到右去寻找到i的最大子数组和,将结果存在一个新的数组中;然后再从右到左去寻找最大子数组和;考虑两者之和,取最大值。
参考答案:
class Solution {
public:
/*
* @param nums: A list of integers
* @return: An integer denotes the sum of max two non-overlapping subarrays
*/
int maxTwoSubArrays(vector<int> &nums) {
// write your code here
if (nums.size() == 0 | nums.size()==1)
cout<<"the input is zero!"<<endl;
//if(nums.size()==2)
// {
// return nums[0]+nums[1];
// }
int news[nums.size()];
int sum=nums[0];
int sum_max=nums[0];
news[0] = nums[0];
for(int i=1;i<nums.size()-1;i++){
sum=max(nums[i],nums[i]+sum);
if(sum > sum_max){
sum_max = sum;
}
news[i] = sum_max; //新数组表示以i结尾的最大值;
}
sum = 0;
sum_max = nums[nums.size()-1];
int result = -123;
for(int i=nums.size()-1; i>0; i--){
sum = max(nums[i], nums[i]+sum);
if(sum >= sum_max){
sum_max = sum;
}
result = max(result, sum_max+news[i-1]);
}
return result;
}
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。