动态规划

alt

1、定义数组元素的含义

dp[i][j]表示到达dp[i][j]的路径数量

2、找出数组元素间的关系式

有两种⽅式到达 ⼀种是从 (i-1, j) 这个位置⾛⼀步到达
⼀种是从(i, j - 1) 这个位置⾛⼀步到达
所以有 dp[i][j] = dp[i-1][j] + dp[i][j-1]

3、初始值

dp[0] [0….n-1] = 1; // 相当于最上⾯⼀⾏,只能⼀直往左⾛
dp[0…m-1] [0] = 1; // 相当于最左⾯⼀列,只能⼀直往下⾛

优化

空间复杂度:O(m * n)
优化后,空间复杂度:O(n)
递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1]。

1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20

从表中可以看到:

  • 当你要填充第三,第四....第 n ⾏的时候,第⼀⾏的值永远不会⽤到,只有填充第⼆⾏的值时会⽤到。
  • 因此,只需要⽤⼀个⼀维的 dp[] 来保存⼀⾏的历史记录就可以了
  • 此时,推导公式为:dp[i] = dp[i-1] + dp[i]
    比如求(3,2)这个坐标的元素时,是用(3,0)+(2,2),更新下一行的时候,是从左向右开始更新的,也就是相当于dp[i][j] = dp[i-1][j] + dp[i][j-1]。