Cómo resolver CCC2016S4

La segunda mitad de la respuesta de Richard Morris está en el camino correcto, pero no completamente allí. Básicamente continuaré donde lo dejó, completaré algunos detalles y agregaré algunas optimizaciones.

Usemos [matemática] B (i, j) [/ matemática] para denotar la respuesta a la siguiente pregunta: “¿Se pueden ensamblar todas las bolas originales con números [matemática] i, \ ldots, j-1 [/ matemática] una sola pelota?

Claramente, todo lo que necesitamos para resolver nuestra tarea es encontrar un par [matemáticas] (i, j) [/ matemáticas] de manera que [matemáticas] B (i, j) [/ matemáticas] sea verdadero y la suma de las bolas [matemáticas ] i [/ math] a [math] j-1 [/ math] es lo más grande posible. Haremos eso evaluando [matemática] B (i, j) [/ matemática] para cada rango posible [matemática] (i, j) [/ matemática], luego simplemente elegiremos el mejor rango para el cual [matemática] B (i, j) [/ math] es cierto.

Lo que requiere más tiempo al evaluar [matemáticas] B (i, j) [/ matemáticas] es evaluar si es posible dividir este rango en tres partes, fusionar cada parte en una bola (estas son llamadas recursivas), y luego fusionar esas tres partes en una sola. Y aquí es donde entra la optimización.

Tenemos que darnos cuenta de que no tenemos que intentar todas las formas posibles de dividir el rango [matemáticas] [i, j) [/ matemáticas] en tres partes. (El número de estas formas sería cuadrático en la longitud del rango). Solo necesitamos esas formas para las cuales la suma de la primera parte es igual a la suma de la tercera parte. Y el número de estos es necesariamente pequeño: en el peor de los casos, es lineal en [math] ji. [/ Math]

¿Cómo encontrar estas buenas formas? Comencemos con [matemáticas] i = k [/ matemáticas] y [matemáticas] l = j [/ matemáticas]. Las variables [matemáticas] k, l [/ matemáticas] dividen nuestro rango [matemáticas] [i, j) [/ matemáticas] en tres rangos: [matemáticas] [i, k) [/ matemáticas], [matemáticas] [k, l) [/ math] y [math] [l, j) [/ math]. Ahora nos moveremos [matemática] k, l [/ matemática] uno hacia el otro, siempre moviendo el que actualmente tiene la menor suma de tamaños de bolas. (Por ejemplo, cuando la suma de bolas en [matemáticas] [i, k) [/ matemáticas] es menor que la suma de bolas en [matemáticas] [l, j) [/ matemáticas], incrementamos [matemáticas] k [/ matemática].) Obviamente, de esta manera encontraremos todos los pares [matemática] k, l [/ matemática] de tal manera que las sumas de la primera y tercera parte sean iguales, ya que nunca podremos omitir tal par. Siempre que encontramos tal par [matemática] k, l [/ matemática], la procesamos y luego ambos incrementamos [matemática] k [/ matemática] y disminuimos [matemática] l [/ matemática].

Y eso es. Cada vez que encontramos un par válido [matemática] k, l [/ matemática], hacemos tres llamadas recursivas para verificar [matemática] B (i, k) [/ matemática], [matemática] B (k, l) [/ matemática] y [matemática] B (l, j). [/ matemática] Si las tres se evalúan como verdaderas, devolveremos verdaderas.

Con esta mejora, la solución se ejecuta en [math] O (n ^ 3) [/ math], que es claramente lo suficientemente rápido para las restricciones dadas.

Puede hacer una solución exhaustiva probando todas las combinaciones posibles. Hay un máximo de 400 bolas, lo que podría provocar una explosión combinatoria.

Una solución exhaustiva podría funcionar construyendo una estructura de árbol de manera recursiva.

En cada paso tiene una lista ordenada de enteros, que se almacena en el nodo actual. Encuentre cada par de enteros adyacentes coincidentes o enteros coincidentes separados por uno, en la lista. Para cada par, haga una nueva rama en el árbol, con la nueva lista que contiene el tamaño combinado. Una vez que el árbol está construido, simplemente encuentre la bola de arroz más grande en cualquier nodo.

En el primer paso con 400 bolas, hay un máximo de 399 pares adyacentes. En el siguiente paso hay 399 con 398 pares. ¡Parece que hay una situación peor con un orden de 400! posibles ramas para probar. Demasiados.

Lo anterior podría resolver N = 4, N≤ 10 y posiblemente N≤ 50, pero es probable que falle para N = 400.

Una solución más inteligente podría ser buscar el tamaño máximo que puede hacer y ver si es posible hacer una pelota de ese tamaño. Primero sume el tamaño de todas las bolas. Esto da el tamaño máximo posible. Ignora la condición de adyacencia por ahora y solo considera pares de bolas bolas i y j. Encuentra la suma de las bolas entre i y j. Esto proporciona una variedad de tamaños posibles. Examine esta matriz de encontrar el tamaño máximo de construcción. Esto ahora le da un posible punto de inicio y finalización. Intenta construir ese tamaño. Con el ejemplo 47 12 12 3 9 9 3 vemos que el tamaño máximo posible es 95. No es posible construir eso, el siguiente más grande es 48, y eso se puede construir.

Podemos probar si la secuencia de la bola i a la bola j es construible eligiendo una posición k entre ellas. Si Sum (i, k) = Sum (k + 1, j) entonces puede ser posible construyendo dos bolas, que serán adyacentes. La otra opción es elegir dos números k, l con k