Fix the introduction to DP.
This commit is contained in:
parent
1804f8759e
commit
d8b2eb1a32
@ -654,25 +654,25 @@ $$
|
|||||||
|
|
||||||
在该问题中,**下一步选择不能由当前状态(当前楼梯阶数)独立决定,还和前一个状态(上轮楼梯阶数)有关**。如果上一轮是跳 $1$ 阶上来的,那么下一轮就必须跳 $2$ 阶。
|
在该问题中,**下一步选择不能由当前状态(当前楼梯阶数)独立决定,还和前一个状态(上轮楼梯阶数)有关**。如果上一轮是跳 $1$ 阶上来的,那么下一轮就必须跳 $2$ 阶。
|
||||||
|
|
||||||
不难发现,此问题已不满足无后效性,状态转移方程 $dp[i] = dp[i-1] + dp[i-2]$ 也随之失效,因为 $dp[i-1]$ 代表本轮跳 $1$ 阶,但其中包含了许多“上一轮跳 $1$ 阶上来的”方案,而为了满足约束,我们不能将 $dp[i-1]$ 直接计入 $dp[i]$ 中。
|
不难发现,此问题已不满足无后效性,状态转移方程 $dp[i] = dp[i-1] + dp[i-2]$ 也失效了,因为 $dp[i-1]$ 代表本轮跳 $1$ 阶,但其中包含了许多“上一轮跳 $1$ 阶上来的”方案,而为了满足约束,我们不能将 $dp[i-1]$ 直接计入 $dp[i]$ 中。
|
||||||
|
|
||||||
为了解决该问题,我们需要扩展状态定义:**状态 $[i, j]$ 表示处在第 $i$ 阶、并且上一轮跳了 $j$ 阶**,$dp[i, j]$ 表示该状态下的方案数量。此状态定义有效地区分了上一轮跳了 $1$ 阶还是 $2$ 阶,我们可以据此来决定下一步该怎么跳:
|
为了解决该问题,我们需要扩展状态定义:**状态 $[i, j]$ 表示处在第 $i$ 阶、并且上一轮跳了 $j$ 阶**,其中 $j \in \{1, 2\}$ 。此状态定义有效地区分了上一轮跳了 $1$ 阶还是 $2$ 阶,我们可以据此来决定下一步该怎么跳:
|
||||||
|
|
||||||
- 当 $j$ 等于 $1$ ,即上一轮跳了 $1$ 阶时,这一轮只可选择跳 $2$ 阶;
|
- 当 $j$ 等于 $1$ ,即上一轮跳了 $1$ 阶时,这一轮只能选择跳 $2$ 阶;
|
||||||
- 当 $j$ 等于 $2$ ,即上一轮跳了 $2$ 阶时,这一步可选择跳 $1$ 阶或跳 $2$ 阶;
|
- 当 $j$ 等于 $2$ ,即上一轮跳了 $2$ 阶时,这一轮可选择跳 $1$ 阶或跳 $2$ 阶;
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
由此,我们便能推导出以下的状态转移方程:
|
在该定义下,$dp[i, j]$ 表示状态 $[i, j]$ 对应的方案数。由此,我们便能推导出以下的状态转移方程:
|
||||||
|
|
||||||
$$
|
$$
|
||||||
\begin{cases}
|
\begin{cases}
|
||||||
dp[i][1] = dp[i-1][2] \\
|
dp[i, 1] = dp[i-1, 2] \\
|
||||||
dp[i][2] = dp[i-2][1] + dp[i-2][2]
|
dp[i, 2] = dp[i-2, 1] + dp[i-2, 2]
|
||||||
\end{cases}
|
\end{cases}
|
||||||
$$
|
$$
|
||||||
|
|
||||||
最终,返回 $dp[n][1] + dp[n][2]$ 即可,两者之和代表爬到第 $n$ 阶的方案总数。
|
最终,返回 $dp[n, 1] + dp[n, 2]$ 即可,两者之和代表爬到第 $n$ 阶的方案总数。
|
||||||
|
|
||||||
=== "Java"
|
=== "Java"
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# 小结
|
# 小结
|
||||||
|
|
||||||
- 算法在日常生活中无处不在,并不是遥不可及的高深知识。实际上,我们已经在不知不觉中学习了许多“算法”,用以解决生活中的大小问题。
|
- 算法在日常生活中无处不在,并不是遥不可及的高深知识。实际上,我们已经在不知不觉中学会了许多算法,用以解决生活中的大小问题。
|
||||||
- 查阅字典的原理与二分查找算法相一致。二分查找体现了分而治之的重要算法思想。
|
- 查阅字典的原理与二分查找算法相一致。二分查找体现了分而治之的重要算法思想。
|
||||||
- 算法是在有限时间内解决特定问题的一组指令或操作步骤,而数据结构是计算机中组织和存储数据的方式。
|
- 算法是在有限时间内解决特定问题的一组指令或操作步骤,而数据结构是计算机中组织和存储数据的方式。
|
||||||
- 数据结构与算法紧密相连。数据结构是算法的基石,而算法则是发挥数据结构作用的舞台。
|
- 数据结构与算法紧密相连。数据结构是算法的基石,而算法则是发挥数据结构作用的舞台。
|
||||||
|
Loading…
x
Reference in New Issue
Block a user