TD6 : programmation dynamique. - Laboratoire d`Informatique

publicité
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
Téléchargement