- Soit $ f [m] $ le nombre de façons de couvrir la forme indiquée ci-dessous, une $ m $ par $ 2 $ rectangle. Notre objectif ultime est $ f [n] $ .
┌───────────┐
2 │ │
└───────────┘
m
- Soit $ g [m] $ le nombre de façons de couvrir la première forme représentée ci-dessous, une $ m $ par $ 2 $ rectangle avec un carré supplémentaire 1x1 dans le coin supérieur droit. Par symétrie, $ g [m] $ est également le nombre de façons de couvrir la deuxième forme indiquée ci-dessous.
m+1 m
┌─────────────┐ ┌───────────┐
2 │ ┌─┘ 2 │ └─┐
└───────────┘ └─────────────┘
m m+1
Pour trouver la relation de récurrence, essayez de couvrir l'espace à la limite la plus à la droite des formes ci-dessus de toutes les manières possibles.
considérer $ f [m] $ . Nous avons les 4 moyens suivants de couvrir l'espace le plus à droite.
┌─────────┬─┐ ┌──────┬────┐ ┌───────┬───┐ ┌─────────┬─┐
│ │ │ │ ├────┤ │ └─┐ │ │ ┌─┘ │
└─────────┴─┘ └──────┴────┘ └─────────┴─┘ └───────┴───┘
What is left: (m-1)x2 (m-2)x2 (m-2)x2+1 (m-2)x2+1
Alors, nous avons $ \ quad \ quad f [m]= f [m - 1] + f [m - 2] + g [m - 2] \ cdot 2 $ pour $ m \ ge2 $ .
considérer $ g [m] $ . Nous avons les 2 façons suivantes de couvrir l'espace le plus à droite de la première forme.
m+1 m+1
┌─────────┬───┐ ┌─────────┬───┐
│ │ ┌─┘ │ └─┬─┘
└─────────┴─┘ └───────────┘
What is left: (m-1)x2 (m-1)x2+1
nous avons donc $ \ quad \ quad g [m]= f [m - 1] + g [m-1] $ pour $ m \ ge1 $ .
L'application de ce qui précède deux équations de récurrence, on peut calculer tous les $ f [m] $ et $ g [m] $ , dans l'ordre d'augmenter $ m $ , à partir de $ m= 2 $ , Compte tenu des conditions initiales, $ f [0]= 1 $ , $ f [1]= 1 $ , $ g [0]= 0 $ et $ g [1]= 1 $
# Python program to compute the first n+1 values of f
def show_number_of_ways(n):
f = [0] * (n+1)
g = [0] * (n+1)
f[0] = f[1] = g[1] = 1
g[0] = 0
for m in range(2, n+1):
f[m] = f[m - 1] + f[m - 2] + 2 * g[m - 2]
g[m] = f[m - 1] + g[m - 1]
print(f)
show_number_of_ways(10)
# [1, 1, 2, 5, 11, 24, 53, 117, 258, 569, 1255]
Voici un moyen de dériver une relation de récurrence plus simple qui implique $ f $ seulement.
réponse de Glorfindel explique comment calculer le nombre de motifs par « couper le bloc élémentaire extrême droite. »
Pour résumer, il y a un bloc élémentaire de taille $ 1 \ times2 $ , un bloc élémentaire de $ 2 \ times2 $ et deux blocs élémentaires de $ n \ fois2 $ pour $ n \ ge3 $ . Laissez $ f (n) $ Soyez le nombre de motifs pour $ 2 \ fois n $ . Nous avons les cas de base et la relation de récurrence suivants,
$$ f (0)= 1, \ f (1)= 1, \ f (2)= 2, $$
$$ f (n)= f (n-1) + f (n-2) + 2f (n-3) + 2f (n-4) + \ cdots + 2f ( 0), \ Text {for} n \ ge3 $$
Les formules ci-dessus conduit à un algorithme qui calcule $ f (n) $ avec $ O (n ^ 2) $ complexité du temps et $ O (n) $ complexité spatiale.
Nous pouvons faire mieux. Remplacer $ n $ avec $ n-1 $ , nous avons
$$ f (n-1)= f (n-2) + f (n-3) + 2f (n-4) + 2f (n-5) + \ cdots + 2f (0), \ Text {for} n \ ge4 $$
soustraire les deux équations ci-dessus, nous obtenons
$$ f (n) -f (n-1)= f (n-1) + f (n-3) $$
Donc nous avons pour $ n \ ge4 $ ,
$$ f (n)= 2f (n-1) + f (n-3) \ tag {simple} $$
Depuis $ f (3)= 5= 2f (2) + f (0) $ , la relation de récurrence ci-dessus est valable pour tous $ n \ ge3 $ .
Cela conduit à un algorithme qui calcule $ f (n) $ avec $ O (n) $ de temps Complexité et $ O (1) $ Complexité spatiale.
# Python program to compute the first n+1 values of f
def show_number_of_ways(n):
f = [0] * (n+1)
f[0] = f[1] = 1
f[2] = 2
for i in range(3, n+1):
f[i] = 2 * f[i - 1] + f[i - 3]
print(f)
show_number_of_ways(10)
# [1, 1, 2, 5, 11, 24, 53, 117, 258, 569, 1255]
Nous pouvons également déduire la relation simple de récurrence directement à partir des deux premières relations récursives mutuelles entre $ f $ et $ g $ .
L'égalité $ g [m]= f [m - 1] + g [m-1] $ nous dit $ f [m-1]= g [m] -g [m-1] $ , et, par conséquent, $ f [m]= g [m + 1] -g [m] $ et $ f [m-2]= g [m-1] -g [m-2] $ . Les appliquer pour éliminer les $ f $ loin dans $ f [m]= f [m - 1] + f [m - 2] + g [m - 2] \ cdot $ 2 , nous obtenons $ g [m + 1]= 2 g [m] + g [m-2] $ .
Comme $ f [m] $ est une combinaison linéaire de $ g [m + 1] $ et $ g [m] $ , $ f $ satisfixes
es le même type de relation de récurrence, c'est-à-dire
$ f [m]= 2f [m-1] + f [m-3] $ .Vérification de la plage valide de l'index $ M $ , nous voyons qu'il est de valeur pour tous $ m \ ge3 $ .