[LeetCode en Python] 5383 (H) número de formas de pintar cuadrícula nx 3 Número de esquemas para pintar gráfico de cuadrícula N x 3

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)

Supongo que te gusta

Origin www.cnblogs.com/journeyonmyway/p/12684662.html
Recomendado
Clasificación