Titulo:
https://leetcode-cn.com/problems/number-of-ways-to-paint-nx-3-grid/
Tiene una cuadrícula nx 3, debe colorear cada cuadrícula con uno de los colores rojo, amarillo y verde, y asegurarse de que las cuadrículas adyacentes tengan un color diferente (es decir, cuadrículas con los mismos lados horizontales o verticales) Diferentes colores).
Le da el número de filas en el gráfico de cuadrícula n.
Devuelva la cantidad de esquemas que colorean la cuadrícula. Como la respuesta puede ser muy grande, devuelva el resultado del par de respuestas 10 ^ 9 + 7.
Ejemplo 1:
Entrada: n = 1
Salida: 12
Explicación: Hay 12 métodos posibles en total:
Ejemplo 2
Entrada: n = 2
Salida: 54
Ejemplo 3
Entrada: n = 3
Salida: 246
Ejemplo 4
Entrada: n = 7
Salida: 106494
Ejemplo 5:
Entrada: n = 5000
Salida: 30228214
Consejos:
n == grid.length
grid [i] .length == 3
1 <= n <= 5000
Ideas para resolver problemas
- El uso de métodos matemáticos es, por supuesto, el más extático. Usemos métodos simples y crudos.
- Obviamente, siempre que se determine la relación de conversión entre dos líneas adyacentes, el resto es iteración.
- Solo hay 12 patrones en la primera línea de escritura a mano. No mucho
- Luego recorra exhaustivamente para obtener todos los patrones posibles de la siguiente fila correspondientes a estos 12 patrones, y guárdelos como el siguiente diccionario.
- Guarde el patrón en la primera línea como un diccionario anterior, la clave es el patrón y el valor se inicializa a 1, lo que indica que solo hay uno para cada patrón en la primera línea.
- Luego atraviesa desde la segunda línea hasta la última línea.
- Al comienzo de cada línea, primero almacene una curva de diccionario para almacenar el número de ocurrencias de cada patrón.
- ¡Entonces viene el punto!
- Recorre la clave de prev, obtén todos los patrones posibles de la siguiente [clave] y actualiza curr [siguiente [clave]].
- Tenga en cuenta que al actualizar aquí, debe acumular prev [clave] cada vez.
- Al final de cada línea, almacene el contenido de curr en anterior.
- El programa finalmente suma el valor de prev y modulo, y ya está.
Código
class Solution:
def numOfWays(self, n: int) -> int:
pattern = [
'RGB', 'RBG', 'RGR',
'RBR', 'GBR', 'GRB',
'GRG', 'GBG', 'BRG',
'BGR', 'BRB', 'BGB'
]
# - construct transfer dict
# - to handle adjacent rows
next = {}
for p1 in pattern:
next[p1] = []
for p2 in pattern:
is_ok = True
for i in range(3):
if p1[i] == p2[i]:
is_ok = False
break
if is_ok:
next[p1].append(p2)
# - first row
prev = {p:1 for p in pattern}
# - from second row
for i in range(n-1):
# - d is temp dict for current row
curr = {p:0 for p in pattern}
# - accumulate
for k,v in prev.items():
for x in next[k]:
curr[x] += v
# - update previous row
prev = copy.copy(curr)
return sum(prev.values()) % (10**9 + 7)