【leetcode刷题笔记】:53. 最大子序和

动态规划简单题

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
【leetcode刷题笔记】:53. 最大子序和_第1张图片
思路:

  • dp[n]表示以当前元素为终点,最大的连续子数组的值
  • 所以dp[n]的值取决于,以n为终点,但不以n为起点的,和以n为终点也以n为起点的两个值的关系
  • dp[n] = max(dp[n-1] + nums[n] ,nums[n]):如果将前面的值加入当前结点,值比当前结点值还小,那为啥还要加入呢???这不是拖累了以当前结点为终点时,所获得的值吗,那就自己当起点,自己当终点。
  • 然后每次计算dp的时候,获取最大值maxsum,最后输出maxsum
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if(nums.size()<1)    //考虑数组为0的时候
            return 0;
        int dp[nums.size()+1],maxsum=nums[0];
        dp[0] = 0;
        for(int i=1;i<nums.size()+1;i++){
            dp[i] = max(dp[i-1]+nums[i-1],nums[i-1]);
            maxsum = max(maxsum,dp[i]);
        }
        return maxsum;
    }
};

动态规划个人总结:

  • 最近在刷动态规划的简单题,然后习惯性的把dp认为是当前题目问题的一个个小问题,然后绕不出去,比如这题最大和的连续子数组:那么就想当然的以为dp是当前位置的子数组的连续子数组最大值,然后最后函数返回dp[n],这其实是一种思维定势,刷题量不多;
  • 个人觉得dp[n]表示什么是写好代码的关键,在每次考虑dp表示什么的时候,如何考虑呢?
    • 首先毋庸置疑如上所说,dp是要求问题的一个个小问题,dp[n]就是当前题目的一个小问题解决;
    • 如果不行的话,考虑第二点:在用数组的时候,可以考虑考虑以当前结点为起点或者为终点时的dp,这样一趟迭代下来,也可以覆盖全部的可能性咯;跟之前做的三步问题,爬楼梯问题一样,这些都是以dp[n]为终点的考虑,这样就找到当前元素和前一个元素存在关系了;
    • 最后还是多做题,多总结。
  • 动态规划问题大多数是,从小推到大,也就是递推,如果找不到关系的话,先尝试从小推到大找一下关系;
  • 一般使用的空间负责度为O(n),因为要缓存并复用以往结果。
  • 持续总结中……

你可能感兴趣的:(leetcode刷题笔记,leetcode,动态规划)