您的位置:首页 > 编程语言 > C语言/C++

动态规划_最大子数组||_1

2016-10-06 10:46 169 查看
1. 【问题描述】    最大子数组||

2. 【思路】    假设给定数组共有N个元素,令符号(i, j)表示子数组nums[i,i+1,...,j]的最大子数组的和,则所求为:

max{(0,0)+(1,N-1),(0,1)+(2,N-1),...,(0,N-2)+(N-1,N-1)},即需要求出(0,i)和(i+1,N-1),其中

0<=i<=N-2.用一维数组dp0保存(0,i)的值,初始化dp0[0]=(0,0)=nums[0],用符号[0,i]表示子数组nums[0,1,...,i]包含元素nums[i]的最大子数组和,则有:dp0[i]=max{dp0[i-1],[0,i]}.
其中1<=i<=N-2;

用一维数组dpN保存(j,N-1)的值,初始化dpN[N-1]=(N-1,N-1)=nums[N-1],用符号【j,N-1】表示子数组nums[j,j+1,...,N-1]包含元素nums[j]的最大子数组的和,则有:dpN[j]=max{dpN[j+1],【j,N-1】}.

分析[0,i]和【j,N-1】可以发现:

[0,0]=nums[0];

[0,i]=max{nums[i],[0,i-1]+nums[i]};      1<=i<=N-2

【N-1,N-1】=nums[N-1],

【j,N-1】=max{nums[j],【j+1,N-1】+nums[j]};   1<=j<=N-1

下面的代码中用dp0_[i]保存[0,i],用dp_N[j]保存【j,N-1】

3. 【代码】    

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
int N=nums.size();
if(N<=0) {
return 0;
}
vector<int> dp0_(N-1,0);
dp0_[0]=nums[0];
for(int i=1;i<N-1;++i) {
dp0_[i]=nums[i]>=(dp0_[i-1]+nums[i])?nums[i]:(dp0_[i-1]+nums[i]);
}
vector<int> dp_N(N,0);
dp_N[N-1]=nums[N-1];
for(int j=N-2;j>=1;--j) {
dp_N[j]=nums[j]>=(dp_N[j+1]+nums[j])?nums[j]:(dp_N[j+1]+nums[j]);
}
vector<int> dp0(N-1,0);
dp0[0]=nums[0];
for(int i=1;i<N-1;++i) {
dp0[i]=dp0[i-1]>=dp0_[i]?dp0[i-1]:dp0_[i];
}
vector<int> dpN(N,0);
dpN[N-1]=nums[N-1];
for(int j=N-2;j>=1;--j) {
dpN[j]=dpN[j+1]>=dp_N[j]?dpN[j+1]:dp_N[j];
}
int res=INT_MIN;
for(int i=0;i<N-1;++i) {
res=res>=(dp0[i]+dpN[i+1])?res:(dp0[i]+dpN[i+1]);
}
return res;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息