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(n1) + 2 T(n2) + T(n3), 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(n1), A(n2), A(n3). 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,aba,abba, 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, ..., lk1klongueurs 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, ..., nk1tels
que longueur =Pk1
i=0 nili;
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(klongueur)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
Q 1.2. On fixe le gap maximal autorisé à 1. Proposer un algorithme linéaire qui, étant donnée la suite t1, ..., tn
des tailles des images calcule une sous-suite extraite de taille minimale et de gap au plus 1;.
Aide: on pourra utiliser la programmation dynamique et calculer T(i)la taille minimale d’une suite extraite
des images i, i + 1, ..n de gap au plus 1 et qui commence en i.
Q 1.3.Comment étendre l’algorithme précédent à un gap kquelconque? Quelle est alors sa complexité?
Q 2.Maintenant on suppose la taille maximale de la sous-suite fixée et on recherche à extraire une sous-suite
de gap minimal. Pour simplifier, on recherche ici uniquement le gap minimal et non pas une des sous-suites
correspondantes.
Q 2.1. Si la taille maximale est 4, quel est le gap minimal pour la suite:
numero 1234567
taille 2171162
Quelle est la sous-suite correspondante? Quel est le gap minimal la taille maximale est 5?
Q 2.2. Définir un algorithme de complexité au plus O(n2k)pour le problème, i.e. qui, étant donné nla
longueur de la suite, t1, ..., tnla suite des tailles des images et kla taille maximale calcule le gap minimal d’une
sous-suite de taille au plus k.
Q 3.On complique un peu le problème.... Chaque image peut être maintenant codée comme une transformation
de la précédente. Par exemple, si l’image 4est obtenue par transformation de l’image 3, pour la restituer, on
doit disposer aussi de l’image 3. Donc on ne considérera que les sous-suites "correctes", i.e. telles que si l’image
iest contenue dans la sous-suite et est codée comme une transformation de la précédente, l’image i1soit
aussi présente dans la sous-suite.
On associe donc à l’image iun booléen ind(i)qui vaut Vrai Ssi l’image ine dépend pas de la précédente,
i.e. l’image iest "indépendante". On suppose que l’image 1 est indépendante. Par exemple, soit la suite:
numero 1 2 3 4 5 6 7 8 9 10 11 12
taille 2 4 7 6 1 6 2 7 4 6 5 8
ind T T F F F T T F T F F F
Si les sous-suites 1,3,5,6 et 1,2,3,5,6 sont incorrectes, la sous-suite 2,3,4,7,9,10,11 est correcte.
Q 3.1. Soit la suite ci-dessous:
numero 1 2 3 4 5 6 7 8 9 10
taille 2 4 7 6 1 6 2 7 4 6
ind TTFFFFFFTF
Quelle est la sous-suite de gap au plus 2et de taille minimale?
Quel est le gap minimal d’une sous-suite de taille au plus 8? d’une sous-suite au plus 14? au plus 15?
Q 3.2. Proposer un algorithme pour calculer le gap minimal d’une sous-suite correcte, la taille maximale étant
donnée en entrée.
Exercice 6 : L’algorithme de Viterbi
On a un graphe dirigé G= (S, A),Sétant l’ensemble des sommets, Al’ensemble des arcs. Les arcs ont la
particularité d’être étiquetés par des lettres: un arc est donc un triplet (o, b, l)avec o, l’origine, et b, le but, deux
sommets du graphe et lune étiquette (=lettre) appartenant à un alphabet. De plus on a un sommet privilégié
appelé source, noté s. On peut voir un tel graphe comme un automate non nécessairement déterministe, sans
état de sortie. Le problème est de savoir si pour un mot donné uet un sommet c, il y a des chemins partant de
la source s, arrivant en cet étiquetés par u.
s
start
s2
s3
s4
a
a
a,b
b
b
Par exemple, dans ce graphe, il y a deux chemins éti-
quetés par ab qui mènent de sàs4et un qui mène de s
às3. Il n’y en a pas étiqueté par aa s às4mais il y en
a un de sàs3.
3
Q 1. On propose la fonction suivante
--G est un graphe G, s sa source, la fonction ARC représente les arcs de G
function chemin (c:in SOMMET;u:in MOT) return BOOLEAN is
--retourne TRUE SSI il existe dans G un chemin de s a c etiqueté par u
begin
if u’LENGTH=0 then return (s=c) --seul chemin de longueur 0 partant de s
else
for noeud in SOMMET loop
if ARC(noeud,c,u(u’LAST)) and then chemin(noeud,u(u’FIRST..u’LAST-1))
then return TRUE; --il y a un chemin s-->...-->noeud-->c
end if;
end loop;
return FALSE; --on a essayé en vain tous les chemins possibles
end if;
end chemin;
Q 1.1. Montrer que dans le pire des cas la complexité de la fonction ci-dessus peut être exponentielle par
rapport à la longueur du mot u.
Q 1.2. Que dire du nombre d’appels différents, i.e. avec des paramètres différents, de la fonction chemin lors
de l’exécution de chemin(c, u)?
Q 1.3. Déduire de ce qui précède une version dynamique de l’algorithme ci-dessus dont la complexité soit en
O(ln2)avec lla longueur du mot uet nle nombre de sommets du graphe. (On suppose la fonction ARC en
temps constant).
Q 1.4. Modifier l’algorithme précédent pour qu’il retourne aussi un chemin de sàcétiqueté par u, si il en
existe un.
Q 2. On s’intéresse maintenant à une variante du problème ci-dessus qui apparaît dans les problèmes de
transmission avec bruit ou de reconnaissance de la parole. A chaque arc est maintenant associée une probabilité.
Un arc est donc maintenant un quadruplet (o, b, l, p)avec oet bdeux sommets du graphe, lune étiquette et p
une probabilité, i.e. un réel compris entre 0et 1. La probabilité d’un chemin est le produit des probabilités des
arcs qui composent le chemin.
Etudions les chemins étiquetés par ab qui partent de s.
L’un (s> s2> s4) a la probabilité 2/31/4soit
1/6. L’autre (s> s3> s4) a la probabilité 1/3.
Le troisième chemin étiqueté par ab partant de sest
s> s2> s3avec la probabilité 2/33/4soit 1/2:
c’est le chemin le plus probable partant de set étiqueté
par ab.
s
start
s2
s3
s4
a,2/3
a,1/3
a,1;b,3/4
b,1/4
b,1
Modifier l’algorithme de la première question pour calculer le (ou un des) chemin(s) de probabité maximale
partant de set étiqueté par uainsi que sa probabilité (- si il existe un chemin partant de set étiqueté par
u; sinon, une exception pourra être déclenchée-). On pourra supposer que la fonction ARC(o, b, l)retourne
maintenant la probabilité associée à l’arc (o, b, l)si il existe, 0 sinon.
4
1 / 2 100%