【2019春招准备:205.动态规划 Dynamic Programmng】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33907408/article/details/86764538

重要概念:

  • 最优子结构
  • 边界
  • 状态转移方程方程

1.上台阶问题:

有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。要求用程序来求出一共有多少种走法。

问题建模:
最优子结构:F(10)=F(9)+F(8)
边界:F(1)=1 F(2)=2
状态转移方程:F(n)=F(n-1)+F(n-2)

求解问题:
不用算法强行地递归 (时间复杂度O(2^n) 空间复杂度 0)
改进1:重复的计算比较多,可以采用备忘录算法,哈希缓存:每次先访问map,没有的话就进行存放,有就直接取出。(时间复杂度 O(n) 空间复杂度O(n))
改进2:时间已经到了n不能再减少了,目标减少空间。自下而上的存储,由于F(n)只需要知道前面两个元素,因此在这里插入图片描述
时间复杂度O(n) 空间复杂度O(1)

2.打家劫舍:

https://leetcode.com/problems/house-robber/
因为是策略,可以选择是否打劫当前房子i
dp[i]=max{ dp[i-1], nums[i]+dp[i-2] }
在这里插入图片描述

3.最大连续子字段和

https://leetcode.com/problems/maximum-subarray
转换dp数组设置角度:
前i个数组内最长子字段的和(×)
以i结尾的最长子字段的和(√)
在这里插入图片描述

4. 找零钱

https://leetcode.com/problems/coin-change
状态转移比较多,设置的多重循环
在这里插入图片描述

5.三角形

https://leetcode.com/problems/triangle
dp二维数组
自上而下改为自下而上 这样边界只有最上面的一个元素,不然还要进行判断。
在这里插入图片描述
在这里插入图片描述

6. 最长上升子序列

LIS: longest increasing subsequence
注意子序列不是子字段,不用相邻的元素
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_33907408/article/details/86764538