-
动态规划
-
2.25
- 放下包裹并不是与 0 对比,而是与 nums【i】对比
- 谈心记录最大值
-
2.7
- 类似与动态规划与贪心算法
- 每次动态规划时,选择是加入前面的包袱加自己还是从自己开始,dp 数组的含义是每个位置存储的最大重量
- 类似与动态规划与贪心算法
-
1.23
- 忘记状态转移公式了,记录全局最大值为数组的第一个
-
1.12
- 一开始觉得眼熟,知道是动态思路后能做,但有个 bug
- 就是 maxValue 初值应该是数组第一个数字,而不是极小值或者 0
class Solution {
public int maxSubArray(int[] nums) {
int[] dp = new int[nums.length];
dp[0] = nums[0];
//int maxValue = Integer.MIN_VALUE;
int maxValue = nums[0];
for(int i=1;i<nums.length;i++){
dp[i] = Math.max(nums[i],dp[i-1]+nums[i]);
maxValue = Math.max(dp[i],maxValue);
}
return maxValue;
}
}class Solution {
public int maxSubArray(int[] nums) {
int maxSum = nums[0];
int dp = nums[0];
for(int i = 1; i<nums.length;i++){
dp = Math.max(nums[i],dp+nums[i]);//这里的dp是dp[i-1]]
maxSum = Math.max(maxSum,dp);
}
return maxSum;
}
}- 状态转移方程
$dp[i]=max(dp[i−1]+nums[i], nums[i])$
🧠 直觉理解(形象比喻) 你可以把它想成“背负行李走路”:
- 你每走一步,就加上一个值(当前元素的分数);
- 如果背包里的总和是负数,那就把包清空(重新开始);
- 你只记录走到现在为止的最重的“包”(最大和)。