Programación dinámica del estado de compresión-tres estados-5383. Número de esquemas para colorear la cuadrícula N x 3

2020-04-12 20:44:30

Descripción del problema:

Tiene una cuadrícula de cuadrícula nx 3. Debe colorear cada cuadrícula con una de 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 el número de esquemas pintados a 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:

 

Consejos:

  • n == grid.length
  • grid[i].length == 3
  • 1 <= n <= 5000

Resolución de problemas:

Puede usar la compresión de estado para resolver, la principal dificultad es que aquí hay tres estados, necesita usar 2 bits para representar.

Complejidad del tiempo: O (n * 64 * 64)

    int [] [] dp = nuevo int [5050] [64]; 
    int mod = (int) 1e9 + 7; 
    public int numOfWays (int n) { 
        for (int i = 0; i <64; i ++) { 
            int c1 = get_color (i, 0); 
            int c2 = get_color (i, 1); 
            int c3 = get_color (i, 2); 
            if (c1 == 3 || c2 == 3 || c3 == 3) continuar; 
            if (c1 == c2 || c2 == c3) continuar; 
            dp [0] [i] = 1; 
        } 
        for (int i = 1; i <n; i ++) { 
            for (int curr = 0; curr <64; curr ++) { 
                int c1 = get_color (curr, 0); 
                int c2 = get_color (curr, 1); 
                int c3 = get_color (curr, 2);
                if (c1 == 3 || c2 == 3 || c3 == 3) continuar; 
                if (c1 == c2 || c2 == c3) continuar; 
                for (int prev = 0; prev <64; prev ++) { 
                    int v1 = get_color (prev, 0); 
                    int v2 = get_color (anterior, 1); 
                    int v3 = get_color (anterior, 2); 
                    if (v1 == 3 || v2 == 3 || v3 == 3) continuar; 
                    if (v1 == v2 || v2 == v3) continuar; 
                    if (v1 == c1 || v2 == c2 || v3 == c3) continuar; 
                    dp [i] [curr] = (dp [i] [curr] + dp [i - 1] [prev])% mod; 
                } 
            } 
        } 
        int res = 0; 
        para (int i = 0; i <64; i ++) { 
            res = (res + dp [n - 1] [i])% mod; 
        } 
        return res; 
    } 
    
    private int get_color (int num, int idx) { 
        return (num >> 2 * idx) & 3; 
    }

  

Supongo que te gusta

Origin www.cnblogs.com/hyserendipity/p/12687507.html
Recomendado
Clasificación