diff --git a/path.lyx b/path.lyx index 6a5d143..1b8ca04 100644 --- a/path.lyx +++ b/path.lyx @@ -90,7 +90,7 @@ \begin_inset Newline newline \end_inset -v0.1 trunk +v0.1 preview \end_layout \begin_layout Author @@ -167,8 +167,8 @@ reference "sub:全图寻路的Floyd算法" \end_layout \begin_layout Standard -另一方面,很多原本不存在图论模型的动态规划题目,也可转化成或建立起图论模型,并利用图论中的寻路算法进行解答。例如完全背包问题(TODO:引用相应章节),就可转化 -为图论模型:容量为 +另一方面,很多原本不存在图论模型的动态规划题目,也可转化成或建立起图论模型,并利用图论中的寻路算法进行解答。例如完全背包问题(TODO:引用《背包问题九讲》的相 +应章节),就可转化为图论模型:容量为 \begin_inset Formula $V$ \end_inset @@ -235,13 +235,336 @@ reference "sub:有向无环图中的寻路" \end_layout \begin_layout Subsection -方阵中的寻路 +矩阵中的寻路 \end_layout \begin_layout Subsubsection 基础问题 \end_layout +\begin_layout Standard +问题是这样的:设有一 +\begin_inset Formula $M\times N$ +\end_inset + +的矩阵 +\begin_inset Formula $P$ +\end_inset + +,矩阵单元格中的元素皆是数字。从矩阵的左上角走到右下角,只能向右或向下走,怎样能使覆盖到的数字之和最大?(TODO:配图?) +\end_layout + +\begin_layout Standard +\begin_inset Formula $M\times N$ +\end_inset + +的矩阵从左上走到右下,需要走 +\begin_inset Formula $M+N-2$ +\end_inset + +步,其中向下走 +\begin_inset Formula $M-1$ +\end_inset + +步,向右走 +\begin_inset Formula $N-1$ +\end_inset + +步,故可能的方案数共有 +\begin_inset Formula $\left(\begin{array}{c} +M-1\\ +M+N-2 +\end{array}\right)$ +\end_inset + +种。用搜索穷举所有方案的时间复杂度太高,考虑使用动态规划算法。 +\end_layout + +\begin_layout Standard +动态规划算法的一个典型思考方式是“只想一步”。以这道题目为例来说明,尽管要求做出的是 +\begin_inset Formula $M+N-2$ +\end_inset + +个向右或者向下的指令,我们不妨想想:知道了什么信息,就可以得出第一步应该怎么走。 +\end_layout + +\begin_layout Standard +第一步有两种走法,向右走从 +\begin_inset Formula $(0,0)$ +\end_inset + +走到 +\begin_inset Formula $(0,1)$ +\end_inset + +,或者向下走从 +\begin_inset Formula $(0,0)$ +\end_inset + +走到 +\begin_inset Formula $(1,0)$ +\end_inset + +,二者的分野不仅存在于这一步覆盖到的数字不同,也体现在今后可选择的策略不同。例如若第一步向右走则左边第一列的数字再也无法拿到。 +\end_layout + +\begin_layout Standard +如何才能判别从 +\begin_inset Formula $(0,0)$ +\end_inset + +到 +\begin_inset Formula $(M-1,N-1)$ +\end_inset + +的路途中第一步怎么走呢?怎样比较第一步的两种走法的优劣呢?很简单,这一方面取决于 +\begin_inset Formula $\text{(0,1)}$ +\end_inset + +和 +\begin_inset Formula $\text{(1,0)}$ +\end_inset + +上面的数字,另一方面也取决于,从这两点出发,走到终点的过程中还会覆盖哪些数字,可能覆盖的最大的数字之和是多少。 +\end_layout + +\begin_layout Standard +于是这样抽象出动态规划的子问题: +\end_layout + +\begin_layout Standard +设 +\begin_inset Formula $F[i,j]$ +\end_inset + +表示从 +\begin_inset Formula $(i,j)$ +\end_inset + +出发,走到 +\begin_inset Formula $(M-1,N-1)$ +\end_inset + +,可以覆盖到的数字之和的最大值,需求解的原问题既是 +\begin_inset Formula $F[0,0]$ +\end_inset + +,边界条件是 +\begin_inset Formula $F[M-1,N-1]=P_{M-1,N-1}$ +\end_inset + +,状态转移方程是: +\end_layout + +\begin_layout Standard +\begin_inset Formula +\[ +F[i,j]=P_{i,j}+\mathrm{max}\left\{ \begin{array}{c} +F[i,j+1]\:\mathbf{if}\: j+1