YBTOJ 「基础算法」第1章 递推算法
题目
A.错排问题
-
状态设置: f i f_{i} fi 表示对于 i i i 个数的合法排列个数
-
递推式: f i = ( i − 1 ) × ( f i − 1 + f i − 2 ) f_{i}=(i-1)\times(f_{i-1}+f_{i-2}) fi=(i−1)×(fi−1+fi−2) ( n ≥ 3 ) (n\geq 3) (n≥3)
-
思路:考虑数字 n n n放在合法位置的情况数为 n − 1 n-1 n−1,而数字 n n n放在第 k k k个位置时,数字 k k k的放置情况分为两种,可以放在第 n n n个位置上,也可以放在其余 n − 2 n-2 n−2个位置上。则当数字 n n n放在第 k k k个位置时,情况总数为 f i − 1 + f i − 2 f_{i-1}+f_{i-2} fi−1+fi−2。
B.传球游戏
f i , j = { f n , j − 1 + f 2 , j − 1 i = 1 f n − 1 , j − 1 + f 1 , j − 1 i = n f i + 1 , j − 1 + f i − 1 , j − 1 i ≠ n ≠ 1 f_{i,j}=\left\{ \begin{array}{rcl} f_{n,j-1} + f_{2,j-1} && {i=1}\\ f_{n-1,j-1} + f_{1,j-1} & & {i=n}\\ f_{i+1,j-1} + f_{i-1,j-1} & & {i\neq n\neq 1}\\ \end{array} \right. fi,j=⎩⎨⎧fn,j−1+f2,j−1fn−1,j−1+f1,j−1fi+1,j−1+fi−1,j−1i=1i=ni=n=1
C.数的划分
f i , j = { 0 i < j 1 i = j f i − j , j + f i − 1 , j − 1 i > j f_{i,j}=\left\{ \begin{array}{rcl} 0&&{i<j}\\ 1&&{i=j}\\ f_{i-j,j} + f_{i-1,j-1}&&{i>j}\\ \end{array} \right. fi,j=⎩⎨⎧01fi−j,j+fi−1,j−1i<ji=ji>j
D.栈的问题
f i , j = { 1 j = 0 f i − 1 , j + f i , j − 1 j ≠ 0 f_{i,j}=\left\{ \begin{array}{rcl} 1 & & {j=0}\\ f_{i-1,j}+f_{i,j-1} & & {j\neq 0}\\ \end{array} \right. fi,j={1fi−1,j+fi,j−1j=0j=0