En primer lugar, la declaración del problema está mal escrita.
> calcule la longitud máxima de la barra de chocolate donde #nos de chocolate fino es más que los números envenenados
Esto indica claramente que necesita encontrar la subsecuencia contigua máxima donde el número de 1s es estrictamente mayor que 0s.
- Informática: ¿Cuáles son las ventajas y desventajas de la arquitectura von Neumann frente a la arquitectura de Harvard?
- ¿Cuáles son los pros y los contras de ir a la UC Santa Cruz para la informática? ¿Cómo pesa UCSC en comparación con otras universidades en términos de CS y empleo después de la universidad?
- ¿Por qué la búsqueda aleatoria es mejor que la búsqueda de cuadrícula para la optimización de hiperparámetros?
- ¿Cuál es la imagen de Cornell en la industria de CS?
- ¿Cómo ayuda la inteligencia artificial? ¿Cuáles son algunas ventajas y desventajas?
Ignoremos completamente el enunciado del problema y veamos los ejemplos.
“10010” se puede dividir en 1 | 00 | 1 | 0 y tomamos la primera y tercera parte haciendo un total de 2.
“10011” puede mantenerse completamente como 10011 y la longitud del segmento es 5.
Para maximizar esto, necesitamos una relación de recurrencia simple:
f (0, n) = max (f (0, i) + f (i, n)) [i = 1 a n].
f (x, x + 1) = 1, si s [x] = 1 más 0.
f (x, y) = 0, si x> = y.
Ahora, un simple dp con estado (lo, hi) como índices inferior y superior es lo suficientemente bueno.
#! / usr / bin / env python # - * - codificación: utf-8 - * - T = int (raw_input ()) para t en xrange (T): N = int (raw_input ()) s = raw_input () memo = {} def resolver (lo, hola): si lo + 1 == hola: return ord (s [lo]) - ord ('0') si lo> = hi: volver 0 if memo.has_key ((lo, hi)): volver memo [(lo, hola)] count1 = s [lo: hi] .count ('1') count0 = s [lo: hi] .count ('0') ret = 0 if count1> count0: ret = hi - lo para idx en rango (lo + 1, hola): ret = max (ret, resolver (lo, idx) + resolver (idx, hi)) memo [(lo, hi)] = ret volver ret imprimir resolver (0, N)