【2019春招准备:205.动态规划 Dynamic Programmng】
重要概念:
- 最优子结构
- 边界
- 状态转移方程方程
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
注意子序列不是子字段,不用相邻的元素