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

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;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值