输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。
输入: nums = [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
了解了动态规划的思想:在于拆分子问题,记住过往,减少重复计算。
思路:
- 穷举分析
- 确定边界
- 找出规律,确定最优子结构
- 写出状态转移方程
由此可知确定转移方程:
dp[i] 代表以元素 nums[i]nums[i] 为结尾的连续子数组最大和。
当 dp[i - 1] >0 时:执行 dp[i] = dp[i-1] + nums[i];
当 dp[i - 1]≤0 时:执行 dp[i] = nums[i]
用动态规划也可以解之前做过的青蛙跳阶的问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 10 级的台阶总共有多少种跳法。
分析可知
边界为:当台阶数是1的时候或者2的时候,可以明确知道青蛙跳法。所以是f(1),f(2)
最优子结构:n>=3时,已经呈现出规律 f(n) = f(n-1) + f(n-2)
转移方程为:
f(n)={
1 n=1;
2 n=2;
f(n-1)+f(n-2) n>=3
}