Este problema se puede resolver con programación dinámica sobre subconjuntos. Debe colocar k estudiantes de tal manera que ningún estudiante esté adyacente entre sí (izquierda, derecha, arriba o abajo).
Aquí está el estado que tengo en mente.
f (fila actual, subconjunto de esta fila (perfil), número de estudiantes llenos)
desde este estado puede llenar un puesto de estudiante (siempre que esté disponible a izquierda y abajo) y marcar este puesto como ocupado y a la derecha y arriba (el perfil de la siguiente fila) como no disponible. Mover a la posición + 2. La respuesta final es f (m + 1,0, k)
Podemos representar subconjuntos como máscaras de bits. Entonces la matriz se vuelve de tamaño [m + 1] [(1 << n)] [k + 1].
- Dada una secuencia de + ve números, ¿encuentra las diferentes combinaciones de elementos cuya suma es mayor que la mitad de la suma total de la secuencia?
- ¿Cuántas pelotas de golf puedes meter en una tubería?
- Dados los vértices y los bordes de un gráfico, ¿cómo se verifica que el gráfico sea un hipercubo?
- ¿Cuál es la probabilidad de que un número elegido al azar sea un número primo?
- ¿Cómo puedo encontrar los números cuadrados más pequeños y más grandes que contienen los dígitos del 1 al 9 sin usar ningún lenguaje de programación?
Referencia:
Foros de TopCoder (Consulte la publicación del recuento de capas + perfil de capa)
Esta también es una cuestión de SPOJ.
Juez Esfera Online (SPOJ)