Come migliorare nel risolvere i problemi di programmazione dinamica


9

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.


La domanda è sbagliata true and (false xor true) = (true and false) xor true(facilmente visibile riducendo entrambi a false xor true).
Peter Taylor,

Ottima domanda! Anche io devo migliorare DP. Alcuni dicono "ah .. DP è solo una semplice ricorsione". Non è!
Florents Tselai,

@Florents Tselai ha appena visto il tuo commento. Perché pensi che non lo sia?
John Donn,

Risposte:


9

La risposta, come in molte altre cose, è:

Pratica, pratica, pratica.

A proposito, credo che nella tua soluzione sei entrato in un vicolo cieco facendo un banale errore molto presto: "Ci sono 2 modi per mettere tra parentesi questa nuova espressione" - non ce ne sono più di 2? Che ne dici (A.B.(C.D.E)), per esempio?


"Come posso migliorare nel fare X?" - "Do X!" ... sembra ragionevole ;-)
Joachim Sauer,

2

Concordo con Occulus sul fatto che la pratica è più richiesta, inoltre vorrei aggiungere che è necessario prestare attenzione nel riconoscere gli schemi di problemi che possono essere risolti usando DP (questo è spiegato abbastanza bene in CLRS)

Puoi trovare problemi di spoj che coinvolgono la programmazione dinamica qui :)


per favore commenta prima del downvote così posso migliorare :)
nischayn22

quel collegamento non funziona!
Deebee,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.