- Permitir $ f [m] $ Sé la cantidad de formas de cubrir la forma que se muestra a continuación, un $ m $ por $ 2 $ Rectangle. Nuestro objetivo final es $ F [n] $ .
┌───────────┐
2 │ │
└───────────┘
m
- Permitir $ g [m] $ Be el número de formas de cubrir la primera forma que se muestra a continuación, un $ m $ por $ 2 $ Rectángulo con un cuadrado extra 1x1 en la esquina superior derecha. Por simetría, $ g [m] $ también es la cantidad de formas de cubrir la segunda forma que se muestra a continuación.
m+1 m
┌─────────────┐ ┌───────────┐
2 │ ┌─┘ 2 │ └─┐
└───────────┘ └─────────────┘
m m+1
Para encontrar la relación de recurrencia, intente cubrir el espacio en el límite más a la derecha de las formas anteriores en todas las formas posibles.
Considere $ f [m] $ . Tenemos las siguientes 4 maneras de cubrir el espacio más a la derecha.
┌─────────┬─┐ ┌──────┬────┐ ┌───────┬───┐ ┌─────────┬─┐
│ │ │ │ ├────┤ │ └─┐ │ │ ┌─┘ │
└─────────┴─┘ └──────┴────┘ └─────────┴─┘ └───────┴───┘
What is left: (m-1)x2 (m-2)x2 (m-2)x2+1 (m-2)x2+1
Entonces, tenemos $ \ quad \ quad f [m]= f [m - 1] + f [m - 2] + g [m - 2] \ cdot 2 $ para $ m \ ge2 $ .
Considere $ g [m] $ . Tenemos las siguientes 2 formas de cubrir el espacio más a la derecha de la primera forma.
m+1 m+1
┌─────────┬───┐ ┌─────────┬───┐
│ │ ┌─┘ │ └─┬─┘
└─────────┴─┘ └───────────┘
What is left: (m-1)x2 (m-1)x2+1
Entonces, tenemos $ \ quad \ quad g [m]= f [m - 1] + g [m-1] $ para $ m \ ge1 $ .
Aplicando las dos ecuaciones de recurrencias anteriores, podemos calcular todo $ f [m] $ y $ g [m] $ , en orden de creciente $ m $ , a partir de $ m= 2 $ , Dadas las condiciones iniciales, $ F [0]= 1 $ , $ f [1]= 1 $ , $ g [0]= 0 $ y $ 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]
Aquí hay una manera de obtener una relación de recurrencia más simple que involucra $ f $ solo.
La respuesta de Glorfindel explica cómo calcular el número de patrones "Cortar el bloque de primaria más a la derecha".
Para resolver, hay un bloque elemental de tamaño $ 1 \ veces2 $ , un bloque elemental de $ 2 \ veces2 $ y dos bloques elementales de $ n \ tim times2 $ para $ n \ ge3 $ . Deje que $ f (n) $ sea el número de patrones para $ 2 \ veces n $ . Tenemos los siguientes casos base y relación de recurrencia,
$$ 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 {para} n \ ge3 $$
Las fórmulas anteriores conducen a un algoritmo que calcula $ f (n) $ con $ o (n ^ 2) $ complejidad de tiempo y $ o (n) $ complejidad espacial.
Podemos hacerlo mejor. Reemplazo de $ n $ con $ n-1 $ , tenemos
$$ F (N-1)= F (N-2) + F (N-3) + 2F (N-4) + 2F (N-5) + \ CDOTS + 2F (0), \ Text {for} n \ ge4 $$
restando las dos ecuaciones anteriores, obtenemos
$$ F (N) -F (N-1)= F (N-1) + F (N-3) $$
Así que tenemos para $ n \ ge4 $ ,
$$ F (N)= 2F (N-1) + F (N-3) \ TAG {SIMPLE} $$
Desde $ f (3)= 5= 2f (2) + f (0) $ , la relación de recurrencia anterior tiene para todos $ n \ ge3 $ .
Esto lleva a un algoritmo que calcula $ f (n) $ con $ o (n) $ tiempo- complejidad y $ O (1) $ complejidad espacial.
# 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]
También podemos derivar la relación de recurrencia simple directamente de las dos primeras relaciones recursivas mutuas entre $ f $ y $ g $ .
La igualdad $ g [m]= F [m - 1] + g [m-1] $ nos dice $ F [M-1]= G [M] -G [M-1] $ , y, por lo tanto, $ f [m]= g [m + 1] -g [m] $ y $ f [m-2]= g [m-1] -g [M-2] $ . Aplicándolos para eliminar $ f $ lejos en $ f [m]= f [m - 1] + f [m - 2] + g [m - 2] \ CDOT 2 $ , obtenemos $ g [m + 1]= 2g [m] + g [m-2] $ .
Desde $ f [m] $ es una combinación lineal de $ g [m + 1] $ y $ g [m] $ , $ f $ Satisfi
es el mismo tipo de relación de recurrencia, es decir,
$ f [m]= 2f [M-1] + F [M-3] $ .Verificación del rango válido del índice
$ m $ , vemos que es valor para todos
$ m \ ge3 $ .