Path in a grid

This commit is contained in:
Antti H S Laaksonen 2017-01-02 20:14:49 +02:00
parent 7dac0d0ff5
commit 3441c7f60e
1 changed files with 39 additions and 33 deletions

View File

@ -514,17 +514,19 @@ problem in $O(n \log n)$ time, but this is more difficult.
\section{Path in a grid} \section{Path in a grid}
Seuraava tehtävämme on etsiä reitti Our next problem is to find a path
$n \times n$ -ruudukon vasemmasta yläkulmasta in an $n \times n$ grid
oikeaan alakulmaan. from the upper-left corner to
Jokaisessa ruudussa on luku, ja reitti the lower-right corner.
tulee muodostaa niin, että reittiin kuuluvien Each square contains a number,
lukujen summa on mahdollisimman suuri. and the path should be constructed so
Rajoituksena ruudukossa on mahdollista that the sum of numbers along
liikkua vain oikealla ja alaspäin. the path is as large as possible.
In addition, it is only allowed to move
downwards and to the right.
Seuraavassa ruudukossa paras reitti In the followig grid, the best path is
on merkitty harmaalla taustalla: marked with gray background:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=.65] \begin{tikzpicture}[scale=.65]
\begin{scope} \begin{scope}
@ -566,21 +568,25 @@ on merkitty harmaalla taustalla:
\end{scope} \end{scope}
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Tällä reitillä lukujen summa on $3+9+8+7+9+8+5+10+8=67$, The sum of numbers is
joka on suurin mahdollinen summa vasemmasta yläkulmasta $3+9+8+7+9+8+5+10+8=67$
oikeaan alakulmaan. that is the largest possible sum in a path
from the
upper-left corner to the lower-right corner.
Hyvä lähestymistapa tehtävään on laskea A good approach for the problem is to
kuhunkin ruutuun $(y,x)$ suurin summa calculate for each square $(y,x)$
reitillä vasemmasta yläkulmasta kyseiseen ruutuun. the largest possible sum in a path
Merkitään tätä suurinta summaa $f(y,x)$, from the upper-left corner to the square $(y,x)$.
jolloin $f(n,n)$ on suurin summa We denote this sum $f(y,x)$,
reitillä vasemmasta yläkulmasta oikeaan alakulmaan. so $f(n,n)$ is the largest sum in a path
from the upper-left corner to
the lower-right corner.
Rekursio syntyy havainnosta, The recursive formula is based on the observation
että ruutuun $(y,x)$ saapuvan reitin that a path that ends to square$(y,x)$
täytyy tulla joko vasemmalta ruudusta $(y,x-1)$ can either come from square $(y,x-1)$
tai ylhäältä ruudusta $(y-1,x)$: or from square $(y-1,x)$:
\begin{center} \begin{center}
\begin{tikzpicture}[scale=.65] \begin{tikzpicture}[scale=.65]
\begin{scope} \begin{scope}
@ -594,9 +600,9 @@ tai ylhäältä ruudusta $(y-1,x)$:
\end{tikzpicture} \end{tikzpicture}
\end{center} \end{center}
Kun $r(y,x)$ Let $r(y,x)$ denote the number in square $(y,x)$.
on ruudukon luku kohdassa $(y,x)$, The base cases for the recursive function
rekursion pohjatapaukset ovat seuraavat: are as follows:
\[ \[
\begin{array}{lcl} \begin{array}{lcl}
@ -606,15 +612,15 @@ f(y,1) & = & f(y-1,1)+r(y,1)\\
\end{array} \end{array}
\] \]
Yleisessä tapauksessa valittavana on In the general case there are two
kaksi reittiä, possible paths, and we should select the path
joista kannattaa valita se, that produces the larger sum:
joka tuottaa suuremman summan:
\[ f(y,x) = \max(f(y,x-1),f(y-1,x))+r(y,x)\] \[ f(y,x) = \max(f(y,x-1),f(y-1,x))+r(y,x)\]
Ratkaisun aikavaativuus on $O(n^2)$, koska jokaisessa The time complexity of the solution is $O(n^2)$,
ruudussa $f(y,x)$ saadaan laskettua vakioajassa because each value $f(y,x)$ can be calculated
viereisten ruutujen arvoista. in constant time using the values of the
adjacent squares.
\section{Repunpakkaus} \section{Repunpakkaus}