原题链接
经典求最大子数组和题目。
当然是使用最好的动态规划了,题目比较简单,但是记录一下,算是对动态规划问题的入门学习理解。
思路:
- dp[i] 中保留了以当前元素为最后一个元素的数组的最大子数组和。(这里相当于是在参数传入的数组上直接操作。
- 前后联系起来的关键是“连续”,即:如果前面的一个元素 dp[i-1] 使得自己与后面一个元素 dp[i] 的和变小,那么他肯定不被包含在和最大的子数组中,如果以 dp[i] 开头的数组可能是最大子数组,重新开始算和。即 dp[i-1] <= 0;
- 如果 dp[i-1] > 0,那么以 dp[i] 开头的数组就不可能是和最大的子数组,dp[i] 为原数组的值加上 dp[i-1]。
- 状态转移方程就得出来了(图源)。
代码:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int maxsum = 0;
for(int i =1; i < nums.size();i++){
if(nums[i-1] >= 0) nums[i] += nums[i-1];
}
return *max_element(nums.begin(),nums.end());
}
};
同时给出前面做过的一道动态规划题目:LeetCode 120. 三角形最小路径和