Day 5最大子序和求解

problem description:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大为 6。
1暴力法(事实证明暴力魔法不可取啊(手动狗头))
又一次超时了

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if(nums.size()==0) return 0;
        int max =nums[0];
        int temp =0;
        for(int i=0;i<nums.size();i++)
            for(int j=i;j<nums.size();j++)
            {
                temp=sum(nums,i,j);
                if(temp>max)
                    max=temp;
            }
        return max;
    }
    int sum(vector<int>& nums,int i,int j)
    {
        int sum =0;
        for(int k=i;k<=j;k++)
            sum =sum+nums[k];
        return sum;
    }
};

显然,这是一个可以用动态规划来解决的优化问题,既然要用动态规划来做的话,我们就要考虑如何划分子问题,如果以Maxsubarray(nums,i,j),即i到j的最大子序和的话,这样的很难发现各个子问题之间的联系,如果我们将i固定在一端的话,即创造一个Maxsubarray(nums,i),即求在0到i之间的最大子序列:
maxsubArray(A,i)=maxsubArray(A,i-1)>0?maxsubArray(A,i-1)+A[i];
代码如下:

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n=nums.size();
        if(n==0) return 0;
        int *dp =new int [n];
        dp[0]=nums[0];
        int max=nums[0];
        for(int i=1;i<n;i++)
        {
            dp[i]=nums[i]+((dp[i-1]>0)?dp[i-1]:0);
            max=Max(max,dp[i]);
        }
        return max;
    }
    int Max(int a,int b)
    {
        if(a>b) return a;
        return b;
    }
};

猜你喜欢

转载自blog.csdn.net/shine10076/article/details/82468881