Dada una cadena de 1s y 0s, ¿cuál es la subsección de longitud máxima que satisface (número de 1s)> = (número de 0s)?

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.

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)

Me gusta pasar tiempo para escribir una solución, pero estoy demasiado ocupado para hacerlo ahora. Agregaré el contenido más tarde.

El algoritmo no es difícil. La primera búsqueda en profundidad se puede aplicar, básicamente utilizando la función recursiva, la memorización. El caso base es muy claro, si la cadena tiene más 1s que 0s, entonces la longitud máxima es la longitud de la cadena.

Para construir la fórmula de recurrencia, visite un carácter en la cadena. Tiene dos valores posibles 0 y 1. Para cada valor, por ejemplo, 0, hay dos opciones, ya sea en el medio de la subsección / iniciar una nueva sección o no en la subsección.

Volveremos muy pronto con un código C #.