Ho lavorato sulla programmazione dinamica per qualche tempo. Il modo canonico per valutare una ricorsione di programmazione dinamica consiste nel creare una tabella di tutti i valori necessari e compilarla riga per riga. Vedi ad esempio Cormen, Leiserson et al: "Introduzione agli algoritmi" per un'introduzione.
Mi concentro sullo schema di calcolo basato su tabella in due dimensioni (riempimento riga per riga) e indago la struttura delle dipendenze delle celle, ovvero quali celle devono essere fatte prima che un'altra possa essere calcolata. Indichiamo con l'insieme di indici di celle da cui dipende la cella . Si noti che deve essere privo di cicli.i Γ
Estraggo dalla funzione effettiva che viene calcolata e mi concentro sulla sua struttura ricorsiva. Formalmente, mi si consideri un recurrrence essere programmazione dinamica se ha la forma
con , e qualche funzione (calcolabile) che non utilizza diverso tramite .˜ Γ d ( i ) = { ( j , d ( j ) ) ∣ j ∈ Γ d ( i ) } f d ˜ Γ d
Quando si limita la granularità di alle aree ruvide (a sinistra, in alto a sinistra, in alto, in alto a destra, ... della cella corrente) si osserva che ci sono essenzialmente tre casi (fino a simmetrie e rotazione) di validi ricorsioni di programmazione dinamica che informano su come compilare la tabella:
Le aree rosse indicano (sovrastimazioni di) . I casi uno e due ammettono sottoinsiemi, il caso tre è il caso peggiore (fino alla trasformazione dell'indice). Si noti che non è strettamente necessario che tutte le aree rosse siano coperte da ; alcune celle in ogni parte rossa della tabella sono sufficienti per dipingerlo di rosso. Le aree bianche sono esplicitamente richieste per non contenere alcuna cella richiesta.
Esempi per il primo caso sono la distanza di modifica e la sottosequenza comune più lunga , il secondo caso si applica a Bellman & Ford e CYK . Esempi meno ovvi includono quelli che funzionano sulle diagonali anziché sulle file (o colonne) in quanto possono essere ruotate per adattarsi ai casi proposti; vedere la risposta di Joe per un esempio.
Non ho un esempio (naturale) per il terzo caso! Quindi la mia domanda è: quali sono esempi di ricorsioni / problemi di programmazione dinamica del caso tre?