动态规划:剑指 Offer 42. 连续子数组的最大和

题目描述:

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

 

提示:

  • 1 <= arr.length <= 10^5
  • -100 <= arr[i] <= 100

 

 

 

class Solution{
    public int maxSubArray(int nums[]){
        int res = nums[0];//3.初始化
        for(int i=1;i<nums.length;i++){//4.遍历
            nums[i]+=Math.max(nums[i-1],0);//状态定义1.dp[i] = nums[i] //2.状态转移:dp[i]+=Math.max(nums[i-1],0)
            res = Math.max(res,nums[i]);
        }
        return res;//5.返回坐标
    }
}

 

dp五部曲:
        1.状态定义(确定dp数组及其下标含义):dp[i]为长度为i的绳子剪成m段最大乘积为dp[i]
        2.状态转移(确定递推公式):dp[i]有两种途径可以转移得到
            2.1 由前一个dp[j]*(i-j)得到,即前面剪了>=2段,后面再剪一段,此时的乘积个数>=3个
            2.2 前面单独成一段,后面剩下的单独成一段,乘积为j*(i-j),乘积个数为2
            两种情况中取大的值作为dp[i]的值,同时应该遍历所有j,j∈[1,i-1],取最大值
        3.初始化(dp数组初始化):初始化dp[1]=1即可
        4.遍历顺序:显然为正序遍历
        5.返回坐标:返回dp[n]
posted @ 2023-04-17 15:11  ZDREAMER  阅读(16)  评论(0)    收藏  举报