Di recente mi sono imbattuto in questa domanda: "Ti viene data un'espressione booleana composta da una stringa di simboli" vero "," falso "," e "," o "e" xor ". Conta il numero di modi per mettere tra parentesi il espressione tale che valuterà vero. Ad esempio, ci sono due modi per parentesi "vero e falso xo vero" in modo che valuti vero. "
Sapevo che si trattava di un problema di programmazione dinamica, quindi ho cercato di trovare una soluzione per conto mio, che è la seguente. Supponiamo di avere un'espressione come ABC .... D dove '.' rappresenta una delle operazioni e, o, xor e le lettere maiuscole rappresentano vero o falso. Diciamo che il numero di modi in cui questa espressione di dimensione K produce un vero è N. quando un nuovo valore booleano E viene aggiunto a questa espressione ci sono 2 modi per mettere tra parentesi questa nuova espressione 1. ((ABC .... D) .E) ie. con tutte le possibili parentesi di ABC .... D aggiungiamo E alla fine. 2. (ABC (DE)) ie. valuta prima DE e poi trova il numero di modi in cui questa espressione di dimensione K può produrre vero.
supponiamo che T [K] sia il numero di modi in cui l'espressione con dimensione K produce vero quindi T [k] = val1 + val2 + val3 dove val1, val2, val3 sono calcolati come segue.
1) quando E è raggruppato con D.
i) Non cambia il valore di D
ii) inverte il valore di D
nel primo caso val1 = T [K] = N. (Poiché ciò si riduce all'espressione iniziale ABC ... D). Nel secondo caso rivalutare dp [K] con il valore di D invertito e cioè val1.
2) quando E è raggruppato con l'intera espressione.
// val2 contiene il numero di 'vero' che E produrrà con espressioni che hanno dato 'vero' tra tutte le istanze tra parentesi di ABC ...... D i) se vero.E = vero quindi val2 = N
ii) se true.E = false quindi val2 = 0
// val3 contiene il numero di 'vero' che E produrrà con espressioni che hanno dato 'falso' tra tutte le istanze tra parentesi di ABC ...... D
iii) se false.E = true, allora val3 = (2 ^ (K-2) - N) = M ie. il numero di modi in cui l'espressione con dimensione K produce un falso [2 ^ (K-2) è il numero di modi in cui parentesi un'espressione di dimensione K].
iv) se false.E = false quindi val3 = 0
Questa è l'idea di base che avevo in mente, ma quando ho verificato la sua soluzione http://people.csail.mit.edu/bdean/6.046/dp/dp_9.swf l'approccio era completamente diverso. Qualcuno può dirmi cosa sto facendo di sbagliato e come posso migliorare nel risolvere DP in modo da poter trovare soluzioni come quella sopra me stesso.
Grazie in anticipo.
true and (false xor true) = (true and false) xor true
(facilmente visibile riducendo entrambi afalse xor true
).