Recientemente me encontré con esta pregunta: "Se le da una expresión booleana que consiste en una cadena de los símbolos 'verdadero', 'falso', 'y', 'o' y 'xor'. Cuente la cantidad de formas de paréntesis. expresión tal que se evaluará como verdadero. Por ejemplo, hay dos formas de paréntesis 'verdadero y falso xo verdadero' de modo que se evalúe como verdadero ".
Sabía que era un problema de programación dinámica, así que traté de encontrar una solución por mi cuenta, que es la siguiente. Supongamos que tenemos una expresión como ABC ... D donde '.' representa cualquiera de las operaciones y, o, xor y las letras mayúsculas representan verdadero o falso. Digamos que el número de formas para que esta expresión de tamaño K produzca un verdadero es N. cuando se agrega un nuevo valor booleano E a esta expresión, hay 2 formas de poner entre paréntesis esta nueva expresión 1. ((ABC .... D) .E) es decir. con todos los paréntesis posibles de ABC ... D agregamos E al final. 2. (ABC (DE)) es decir. evalúe DE primero y luego encuentre el número de formas en que esta expresión de tamaño K puede producir verdadero.
supongamos que T [K] es el número de formas en que la expresión con tamaño K produce verdadero, entonces T [k] = val1 + val2 + val3 donde val1, val2, val3 se calculan de la siguiente manera.
1) cuando E se agrupa con D.
i) No cambia el valor de D
ii) invierte el valor de D
en el primer caso val1 = T [K] = N. (ya que esto se reduce a la expresión inicial ABC ... D). En el segundo caso, vuelva a evaluar dp [K] con el valor de D invertido y eso es val1.
2) cuando E se agrupa con toda la expresión.
// val2 contiene el número de 'verdadero' que E producirá con expresiones que dieron 'verdadero' entre todas las instancias entre paréntesis de ABC ...... D i) si es verdadero. E = verdadero, entonces val2 = N
ii) si es verdadero. E = falso, entonces val2 = 0
// val3 contiene el número de 'verdadero' que E producirá con expresiones que dieron 'falso' entre todas las instancias entre paréntesis de ABC ...... D
iii) si es falso. E = verdadero, entonces val3 = (2 ^ (K-2) - N) = M ie. El número de formas en que la expresión con tamaño K produce un falso [2 ^ (K-2) es el número de formas de paréntesis de una expresión de tamaño K].
iv) si es falso. E = falso, entonces val3 = 0
Esta es la idea básica que tenía en mente, pero cuando busqué su solución http://people.csail.mit.edu/bdean/6.046/dp/dp_9.swf el enfoque era completamente diferente. ¿Alguien puede decirme qué estoy haciendo mal y cómo puedo mejorar en la resolución de DP para poder encontrar soluciones como la que mencioné anteriormente?
Gracias por adelantado.
fuente
true and (false xor true) = (true and false) xor true
(Fácil de ver reduciendo ambos afalse xor true
).Respuestas:
La respuesta, como con muchas cosas, es:
Práctica práctica práctica.
Por cierto, creo que en su solución se metió en un callejón sin salida al cometer un error trivial muy pronto: "Hay 2 formas de poner entre paréntesis esta nueva expresión": ¿no hay más de 2? ¿Qué tal
(A.B.(C.D.E))
, por ejemplo?fuente
Estoy de acuerdo con occulus en que la práctica es más necesaria, también me gustaría agregar que debe prestar atención al reconocer los patrones en los problemas que se pueden resolver con DP (esto se explica bastante bien en CLRS)
Puede encontrar problemas de spoj que involucran programación dinámica aquí :)
fuente