diff --git a/luku10.tex b/luku10.tex index bbca39c..bc5fd01 100644 --- a/luku10.tex +++ b/luku10.tex @@ -377,66 +377,66 @@ do { % $\emptyset$, $\{2\}$, $\{5\}$, $\{7\}$, % $\{2,5\}$, $\{2,7\}$, $\{5,7\}$ ja $\{2,5,7\}$. -\section{Dynaaminen ohjelmointi} +\section{Dynamic programming} -\subsubsection{Permutaatioista osajoukoiksi} +\subsubsection{From permutations to subsets} -Dynaamisen ohjelmoinnin avulla on usein mahdollista -muuttaa permutaatioiden läpikäynti osajoukkojen läpikäynniksi. -Tällöin dynaamisen ohjelmoinnin tilana on -joukon osajoukko sekä mahdollisesti muuta tietoa. +Using dynamic programming, it is often possible +to change iteration over permutations into +iteration over subsets. +In this case, the dynamic programming state +contains a subset of a set and possibly +some additional information. -Tekniikan hyötynä on, -että $n$-alkioisen joukon permutaatioiden määrä $n!$ -on selvästi suurempi kuin osajoukkojen määrä $2^n$. -Esimerkiksi jos $n=20$, niin $n!=2432902008176640000$, -kun taas $2^n=1048576$. -Niinpä tietyillä $n$:n arvoilla permutaatioita ei ehdi -käydä läpi mutta osajoukot ehtii käydä läpi. +The benefit in this technique is that +$n!$, the number of permutations of an $n$ element set, +is much larger than $2^n$, the number of subsets. +For example, if $n=20$, then +$n!=2432902008176640000$ and $2^n=1048576$. +Thus, for certain values of $n$, +we can go through subsets but not through permutations. -Lasketaan esimerkkinä, monessako -joukon $\{0,1,\ldots,n-1\}$ -permutaatiossa ei ole -missään kohdassa kahta peräkkäistä lukua. -Esimerkiksi tapauksessa $n=4$ ratkaisuja on kaksi: +As an example, let's calculate the number of +permutations of set $\{0,1,\ldots,n-1\}$ +where the difference between any two successive +elements is larger than one. +For example, there are two solutions for $n=4$: \begin{itemize} \item $(1,3,0,2)$ \item $(2,0,3,1)$ \end{itemize} -Merkitään $f(x,k)$:llä, -monellako tavalla osajoukon -$x$ luvut voi järjestää niin, -että viimeinen luku on $k$ ja missään kohdassa -ei ole kahta peräkkäistä lukua. -Esimerkiksi $f(\{0,1,3\},1)=1$, -koska voidaan muodostaa permutaatio $(0,3,1)$, -ja $f(\{0,1,3\},3)=0$, koska 0 ja 1 eivät -voi olla peräkkäin alussa. +Let $f(x,k)$ denote the number of permutations +for a subset $x$ +where the last number is $k$ and +the difference between any two successive +elements is larger than one. +For example, $f(\{0,1,3\},1)=1$ +because there is a permutation $(0,3,1)$, +and $f(\{0,1,3\},3)=0$ because 0 and 1 +can't be next to each other. -Funktion $f$ avulla ratkaisu tehtävään -on summa +Using $f$, the solution for the problem is the sum \[ \sum_{i=0}^{n-1} f(\{0,1,\ldots,n-1\},i). \] \noindent -Dynaamisen ohjelmoinnin tilat voi -tallentaa seuraavasti: +The dynamic programming states can be stored as follows: \begin{lstlisting} long long d[1<