Leetcode 53 DP*1

dp(dynamic programming)

DP 是一种编程思想,主要用于解决最优解类型的问题。

其思路是为了求解当前的问题的最优解,使用子问题的最优解,然后综合处理,最终得到原问题的最优解。

但是也不是说任何最优解问题都可以DP,使用dp的问题一般满足下面的两个特征:

(1)最优子结构,就是指问题可以通过子问题最优解得到;体现为找出所有的子问题最优解,然后取其中的最优;

(2)重叠子问题,就是子问题是会重复的。而不是一直产生新的子问题(比如分治类型的问题)。
针对这个问题,先构建一个存储最大值的数组all all[i]表示从i到n-1之中的子数组的和的最大值

在构建一个数组start ,start[i]表示从i到n-1中包含nums[i]的子数组的和的最大值

最终我们要返回的值就是all[0]

通过dp思想我们可以得到从i=n-1到i=0 all[i]的最大值,那么all[0]就是最大的。

任意i all[i] = max(a[i+1],start[i])

        start[i] = max (nums[i],nums[i]+start[i+1]);

通过这两个式子进行循环就可以得到all[0]

 int Max(int a,int b)
    {
        if(a>b)
            return a;
        return b;
    }
    int maxSubArray(vector<int>& nums) {
        int n=nums.size();
        vector<int> all(n,0);
        vector<int> start(n,0);
        all[n-1]=start[n-1]=nums[n-1];
        for(int i=n-2;i>=0;i--)
        {
            start[i]=Max(nums[i],start[i+1]+nums[i]);
            all[i]=Max(start[i],all[i+1]);
        }
        return all[0];
    }

猜你喜欢

转载自blog.csdn.net/TempterCyn/article/details/83379306