Je travaille sur la programmation dynamique depuis un certain temps. La manière canonique d'évaluer une récursivité de programmation dynamique consiste à créer une table de toutes les valeurs nécessaires et à la remplir ligne par ligne. Voir par exemple Cormen, Leiserson et al: "Introduction to Algorithms" pour une introduction.
Je me concentre sur le schéma de calcul basé sur une table en deux dimensions (remplissage ligne par ligne) et j'étudie la structure des dépendances des cellules, c'est-à-dire quelles cellules doivent être effectuées avant qu'une autre puisse être calculée. On note avec l'ensemble des indices de cellules dont dépend la cellule . Notez que doit être sans cycle.
Je fais abstraction de la fonction réelle qui est calculée et me concentre sur sa structure récursive. Formellement, je considère une récurrence comme une programmation dynamique si elle a la forme
with , and some (computable) function that does not use other than via .
When restricting the granularity of to rough areas (to the left, top-left, top, top-right, ... of the current cell) one observes that there are essentially three cases (up to symmetries and rotation) of valid dynamic programming recursions that inform how the table can be filled:
The red areas denote (overapproximations of) . Cases one and two admit subsets, case three is the worst case (up to index transformation). Note that it is not strictly required that the whole red areas are covered by ; some cells in every red part of the table are sufficient to paint it red. White areas are explictly required to not contain any required cells.
Examples for case one are edit distance and longest common subsequence, case two applies to Bellman & Ford and CYK. Less obvious examples include such that work on the diagonals rather than rows (or columns) as they can be rotated to fit the proposed cases; see Joe's answer for an example.
I have no (natural) example for case three, though! So my question is: What are examples for case three dynamic programming recursions/problems?