Université d’Aix-Marseille Algorithmique L2 Informatique et Mathématiques - 2016/2017 TD6 : programmation dynamique. Exercice 1 Sous-tableau de somme maximale On considère un tableau contenant des entiers relatifs dont au moins un est positif. On recherche le sous-tableau, constitué de cases successives, dont la somme des éléments est maximale. Par exemple, le tableau -3 1 -1 4 -1 2 1 -5 4 contient un sous-tableau de somme 6 : 4 -1 2 1 Considérons le cas général d’un tableau T [1, n] à n éléments. 1. Une première idée consiste à énumérer tous les sous-tableaux de T et à sélectionner celui dont la somme est maximale. Écrivez l’algorithme correspondant. On pourra utiliser — une variable d variant entre 1 et n, pour marquer le début du sous-tableau courant, — une variable f , variant entre d et n, pour marquer la fin du sous-tableau courant, — une variable s pour calculer la somme des éléments T [d] + . . . + T [f ], — des variables dmax , fmax et smax pour mémoriser le meilleur sous-tableau exploré. 2. Quelle est la complexité de votre algorithme dans le pire des cas ? 3. Une autre idée consiste à utiliser une technique de programmation dynamique (voir la figure 1 pour une illustration de cette technique sur le tableau précédent). Pour cela, on considère la classe de problèmes suivante : pour tout entier m ∈ [1, n], rechercher le sous-tableau de T [1, m] se terminant en m et de somme maximale. On notera smax [m] cette somme maximale et dmax [m] l’indice du début de l’intervalle correspondant. (a) Montrez que si l’on sait résoudre ce problème pour l’indice m, on peut facilement trouver une solution pour l’indice m + 1. Exprimez smax [m + 1] et dmax [m + 1] en fonction de smax [m] et dmax [m] et T [m + 1]. (b) Montrez que si l’on connaı̂t smax [m] et dmax [m] pour tout m, on peut facilement en déduire dmax , fmax et smax . (c) Écrivez l’algorithme correspondant. Quel est sa complexité ? 1 m T [m] smax [m] dmax [m] 1 -3 -3 1 2 1 1 2 3 -1 0 2 4 4 4 4 5 -1 3 4 6 2 5 4 7 1 6 4 8 -5 1 4 9 4 5 4 Figure 1 – Résolution du problème du sous-tableau maximal par une algorithme de programmation dynamique. Exercice 2 Rendre la monnaie On considère un système de monnaie basé sur des pièces de valeurs v1 = 1 < v2 < · · · < vn . Étant donnée une somme S, on cherche une façon de composer S avec un nombre de pièces minimum. Formalisation : on cherche des entiers k1 , . . . , kn tels que S= n X i=1 ki vi et n X ki soit minimale. i=1 1. L’approche gloutonne consiste à utiliser prioritairement les pièces de plus grande valeur. Montrez que cette approche peut ne pas être optimale. Indication : cherchez un système de 3 valeurs pour lequel l’algorithme n’est pas optimal. 2. Proposez un algorithme utilisant la programmation dynamique permettant de résoudre le problème. 3. Quel est sa complexité ? Est-il polynomial ? 2