算法通关 19 - 动态规划
参考资料
动态规划入门
理解动态规划
左神 DP 思路
1.分析可变参数的范围,构造表格
2.标出计算的终止位置
3.标出不要计算直接出答案的位置 base case
4.推普遍位置如何依赖其他位置的
5.定出严格表依次计算的顺序
斐波那契数列
问题
斐波那契数 (通常用 F(n)
表示)形成的序列称为 斐波那契数列 。该数列由 0
和 1
开始,后面的每一项数字都是前面两项数字的和。也就是:
1 | F(0) = 0,F(1) = 1 |
给定 n
,请计算 F(n)
。
动态规划
确定
dp
数组以及下标含义
dp[i]
:第i
个数的斐波那契数值为dp[i]
确定
dp
递推公式
初始化
dp
数组
1 | dp[0] = 0; |
确定
dp
数组遍历顺序
根据 dp 公式, dp[i]
是依赖 dp[i - 1]
和 dp[i - 2]
,那么遍历的顺序一定是从前到后遍历的
举例推导
dp
数组
1 | [0 1 1 2 3 5 8 13 21 34 55] |
原始版本
1 | public int fib(int N) { |
空间压缩版本
1 | public int fib(int N) { |
矩阵快速幂
矩阵乘法
1 | public int[][] muliMatrix(int[][] matrix1, int[][] matrix2) { |
矩阵快速幂
1 | public int[][] matrixPower(int[][] matrix, int p) { |
fib
1 | public int fib(int n) { |
不同路径
问题
一个机器人位于一个 m x n
网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
暴力递归
记忆化搜索
滚动数组优化
最小路径和
三角形最小路径和
动态规划基础
零钱兑换
最长连续递增子序列
完全平方数
跳跃游戏
解码方法
不同路径Ⅱ
滚动数组优化技巧
动态规划强化
回文串专题
最长回文子串
最少分割回文串
经典双串专题
最长公共子序列
编辑距离
正则表达式匹配
乘积最大的子数组
股票专题
买卖股票的最佳时机
买卖股票的最佳时机 Ⅱ
买卖股票的最佳时机 Ⅲ
打家劫舍
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment