Chapter 5: Recursion and Dynamic Programming
Last updated
Was this helpful?
Last updated
Was this helpful?
无论你有没有意识到,这两个原理会经常在递归和动态规划中用到。因为求解一个问题空间(1维/2维/3维)内“有多少个”的问题,就是在求从起点到终点有多少条路径的问题,那么对每个方向就应该用加法原理,对于同一方向路径的每一步骤,就应该用乘法原理。
e.g. A message containing letters from
A-Z
is being encoded to numbers, using'A' -> 1, 'B' -> 2, ... 'Z' -> 26
. Given a non-empty string containing only digits, determine the total number of ways to decode it.
decode这件事有两种方法,第一种是先decode第一个数字再decode剩下的,第二种是先decode第二个数字再decode剩下的,两种方法之间用加法原理。这两种方法都有两个步骤,所以步骤之间要用乘法原理。两种方法的第一个步骤,视数字的范围有0或者1种decode方法。
所以有递推关系
由递推关系可以看到与fibonacci数列求解的相似性(只不过每次可能有0-2个分支,而不总是2个分支)。不难想到同样的,可以用三个变量,用 时间和 空间内解决。
Base Case 永远要写在最前面,尤其是检查memoization cache的前面。
[TODO] 看的方向总是与走的方向相反,因为我们只能查过去走的数据。从左往右走,那就看左边的。从右往左走,就看右边的。 e.g. two sum