文章目录:
今天我们开始动态规划例题的第二个模型——路径问题
叠甲叠甲叠甲:今天的题目全部取自力扣!!!
在开始之前,我们重新回忆一下动态规划的基本步骤
1. 动态规划基本步骤
1. 状态表示:
a. 创建一个dp表(通常是一个数组)
b. 填满dp表,dp表的每一个值就是一个状态
c. 定义状态表示的方法:
i. 题目要求
ii. 经验 + 题目要求:
1)以某一个位置作为起始
2)以某一个位置作为结束
iii. 分析问题的过程中,发现了重复子问题
2. 状态转移方程:根据状态表示得出状态转移方程
用之前或之后的状态推导出当前状态的值
通常:根据最近的一步来划分问题
3. 初始化:保证填表的时候不发生越界
只需要初始化可能发生越界的状态
4. 填表顺序:根据状态转移方程和边界条件,确定子问题的求解顺序
通常是从下到上、从左到右(或称为从小到大)地计算状态值。
5. 返回值
2. 路径问题模型例题
2.1:不同路径
2.1.1:算法原理
1. 状态表示:
a. 创建一个dp表(本题是一个二维数组)
i. 经验 + 题目要求:
1)以某一个位置作为结束
dp[i][j]表示走到(i,j)位置的时候一共有多少方式
2. 状态转移方程:
dp[i][j]:
从上面来:(i-1,j)——> (i,j) :dp[i-1][j]
从左面来:(i,j-1)——> (i,j) :dp[i][j-1]
状态转移方程:dp[i][j] = dp[i-1][j] + dp[i][j-1]
3. 初始化:
本题:填写一个状态时,会用到上面和左面的节点,最上一行和最左一列会发生越界
使用虚拟节点法:
虚拟节点的注意事项:
a. 虚拟节点的值要保证后续填表的结果是正确的
本题需要保证dp[1][1]=1,而dp[1][1] = dp[0][1] + dp[1][0]
需要将dp[0[1] or dp[1][0]初始化为1
b. 注意下标的映射:
上文的dp[1][1]其实就是原始数组的(0,0)位置
4. 填表顺序:
从上到下、从左到右
5. 返回值:dp[m][n]
2.1.2:代码实现
//不同路径问题
public int uniquePaths(int m, int n) {
// 创建dp表
//初始化
//填表
//返回值