UFR IEEA
ACT 2016–2017
Master d’Informatique-S1
TD-Programmation Dynamique
Exercice 1 : Calcul des valeurs d’une suite
Soit la suite T(n)définie par T(2) = T(1) = T(0) = 1 et:
T(n) = T(n−1) + 2 ∗T(n−2) + T(n−3), n > 2
On considère le problème de calculer T(n)pour l’entrée n. Soit l’algorithme naïf récursif associé:
int T(int n){
if (n<=2) return 1;
else return T(n-1)+2*T(n-2)+T(n-3);}
Q 1. Soit A(n)le nombre d’appels récursifs à Teffectués lors de l’exécution de la function T(n). Exprimez
A(n)en fonction de A(n−1), A(n−2), A(n−3). Qu’en déduire sur la complexité de l’algorithme naïf ?
Q 2. Proposez un algorithme en O(n)(en supposant qu’on est dans le cadre du coût uniforme, i.e. en ne
prenant pas en compte la taille des opérandes).
Exercice 2 : Stratégie optimale
Considérons une rangée de npièces de valeur v1, . . . , vnet le jeu suivant à 2 joueurs; à chaque tour, le joueur
peut prendre soit la pièce la plus à gauche, soit la pièce la plus à droite. Le jeu s’arrête quand il n’y a plus de
pièce. L’objectif est bien sûr de maximiser la somme totale des pièces ramassées.
On cherche à calculer le gain optimal du joueur qui commence; on considérera que les deux joueurs adoptent
la stratégie optimale.
Par exemple, pour 5,3,7,11 le gain optimal pour celui qui commence est 16(11 + 5); pour 8,15,3,7ce sera
22(7 + 15)
Q 1. La stratégie gloutonne consistant à prendre parmi les deux pièces possibles, celle à plus forte valeur,
est-elle optimale?
Q 2. Comment est caractérisée une configuration du jeu?
Q 3. Proposer un algorithme qui calcule le gain optimal. En déduire ensuite un algorithme qui donne le coup
à jouer pour chaque configuration.
On cherche maintenant à calculer le gain optimal du joueur A, en considérant que la stratégie du
joueur B est la stratégie gloutonne, c’est à dire qu’il choisit toujours de prendre la pièce de plus
grande valeur.
Par exemple, pour 8,15,3,7, si c’est le tour du joueur Bil prendra 8.
Q 4. Montrer que pour A, la stratégie gloutonne consistant à prendre parmi les deux pièces possibles, celle à
plus forte valeur, n’est pas optimale si il joue face à B.
Q 5. Proposer un algorithme qui calcule le gain optimal pour Aface à un Bglouton.
Exercice 3 : Motifs
Le problème: On cherche à vérifier qu’un mot est bien filtré par un motif très simple. Plus précisément, un mot
sera une suite finie de lettres d’un alphabet donné. Un motif sera un mot sur le même alphabet enrichi de deux
symboles (“wildcards”), ?et ∗.
Le mot ufiltre le motif psi il peut être obtenu à partir de pen remplaçant chaque ?par une lettre, chaque
∗par un mot quelconque (éventuellement vide), chaque +par un mot quelconque non vide. Par exemple, abba
est filtré par les motifs ∗,a∗,∗a,∗b∗,abb ∗a,a∗b∗a,a∗b∗b∗a∗, mais n’est pas filtré par les motifs ∗bab∗,
∗b,b∗,∗bbb ∗a.
Q 1. Pour chacun des motifs suivants, dire si il filtre abba:∗ab∗,∗aa∗,∗a∗,b∗,∗∗
Q 2. Proposer un algorithme linéaire, i.e. en O(|u|+|p|)1, pour le cas où le motif ne contient pas d’∗:
1|u|(resp. |p|) désigne la longueur de u(resp. p).
Entrée: un mot usur Σet un motif psur Σ∪ {?}
Sortie: Oui si uest filtré par p, non sinon.
Q 3. Proposer un algorithme en O(|u|∗|p|)dans le cas général:
Entrée: un mot usur Σet un motif psur Σ∪ {?,∗}
Sortie: Oui si uest filtré par p, non sinon.
L’algorithme que vous avez conçu se comporte-t-il en O(n)si le motif ne comporte pas d’∗? Si non, pouvez-
vous le modifier pour que ce soit le cas?
Exercice 4 : Découpage optimum
On dispose d’une tige d’acier qu’on souhaite découper pour produire des pièces de différentes longueur; il y a
ktypes de telles pièces: pour chaque type i, on connaît la longueur li. Le nombre de pièces de chaque type
que l’on peut produire n’est pas limité mais on cherche à éviter d’avoir des chutes. Par exemple, si k= 3,
l0= 7, l1= 3, l2= 6, pour longueur = 20, on pourra produire deux pièces de type 0et une de type 2. Pour une
longueur de 11, on ne peut éviter une perte, avec par exemple une pièce de type 0et une de type 1.
Le problème de décision est donc:
Donnée: l0, ..., lk−1klongueurs des pièces possibles longueur la longueur totale de la tige
Sortie: Oui Ssi on peut découper la tige en pièces sans perte, i.e. il existe kentiers (≥0)n0, ..., nk−1tels
que longueur =Pk−1
i=0 ni∗li;
Q 1. Montrer, par un exemple, que l’algorithme suivant n’est pas correct.
// Données: longueur et le tableau des l_i
boolean A_Une_Solution() {
Trier le tableau l par valeurs décroissantes
lact=longueur;
for (int i=0; i<k;i++){
// lact/l[i] donnerait n_i, le nb proposé de pièces de type i
lact=lact%l[i]; }
return (l==0);}
Q 2. Proposer un algorithme en O(k∗longueur)qui répond au problème. Le modifier pour qu’il puisse
également retourner la suite des nicorrespondante.
Exercice 5 : Transmission Vidéo
Voici un problème très simplifié de transmission d’images:
On a une suite de nimages. Pour chaque image i, on connaît sa taille t(i). On veut extraire de cette suite
une sous-suite d’images en essayant de réduire la somme des tailles des images extraites et le nombre d’images
consécutives absentes de la sous-suite: ce nombre sera appelé gap. Bien sûr ces deux critères sont "opposés": si
on veut juste minimiser le gap, on prend toute la suite et le gap vaut 0, si on veut minimiser la taille, on prend
la suite vide!
Par exemple, soit la suite d’images:
numero 123456789101112
taille 2 4 7 6 1 6 2 7 4 6 5 8
La suite 1,4,7,10 a une taille totale de 16 et un gap de 2; la suite 2,5,7,9a une taille totale de 11 et un
gap de 3(les trois dernières images). La suite d’images 2,5,7,10 est de taille 13 et de gap 2.
Q 1.Le gap est fixé.
Dans cette partie, le gap autorisé est fixé et on cherche donc à extraire de la suite donnée en entrée une
sous-suite de taille minimale respectant le gap.
Q 1.1. Pour la suite ci-dessous, proposer une suite de taille minimale et de gap 1:
numero 1234567
taille 2171162
2