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; }