动态规划:剑指 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]

浙公网安备 33010602011771号