Sunteți pe pagina 1din 8

LICEUL TEORETIC ION BARBU Prof.

LIVIA MĂRNUNŢELU
Anul şcolar 2011-2012 Clasa a XI-a
DISCIPLINA INFORMATICA 17.03.18

METODA PROGRAMARII DINAMICE

Metoda programarii dinamice se poate folosi pentru problemele in care trebuie sa fie
gasita solutia optima si care au urmatoarele caracteristici :

1. Solutia optima se poate alege dintr-o multme de solitii, fiecarei solutii putand sa i
se asocieze o valoare. Alegerea solutiei optime inseamna alegerea solutiei care
are valoarea optima ( minima sau maxima )

2. Problema poate fi descompusa in subprobleme similare cu problema initial ace


respecta principiul optimalitatii: Solutia este optima daca ea contine solutiile
optime ale subproblemelor

3. Subproblemele in care este descompusa problema nu sunt independente

4. Solutia problemei este data de un vector S={x1,x2,…,xm} si :

-exista o multime finita A din care se poate alege elementul xi al solutiei

-fiecare etapa de determinare a unui element xi al solutiei se bazeaza pe


rezultatele etapelor in care s-au determinat elementele anterioare ale
solutiei

-numarul de posibilitati de a alege elementul xi al solutiei se reduce din


cauza cerintelor de optimizare si a restrictiilor impuse solutei

EXEMPLE DE PROBLEME

I. Se considera un triunghi de numere naturale aij cu n linii. Pornind de la numarul


din linia 1, mergand in jos pana la linia n, sa se determine o selectie a
elementelor astfel incat suma elementelor sa fie maxima . Trecerea la linia
urmatoare se poate face numai mergand in jos , direct sau pe diagonala, la
dreapta.
LICEUL TEORETIC ION BARBU Prof. LIVIA MĂRNUNŢELU
Anul şcolar 2011-2012 Clasa a XI-a
DISCIPLINA INFORMATICA 17.03.18

OBSERVATII

- Multimea datelor de intrare o reprezinta multimea A formata din elementele aij ale
triunghiului

- Valoarea asociata unei solutii este suma elementelor.

- Valoarea solutiei optime este valoarea maxima ( suma elementelor trebuie sa fie
maxima)

- Solutia problemei este data de un vector S={x1,x2,…,xn} unde xi  A. Pentru construirea


solutiei se porneste de la elementul a11 si se merge in jos pana la linia n. Trecerea la linia
urmatoare nu se poate face decat direct, in jos sau pe diagonala, la dreapta, astfel incat
succesorul elementului aij nu poate fi decat elementul ai+1 j sau ai+1 j+1

- Problema poate fi descompusa in subprobleme :

o Subproblema i este alegerea elementului xi al solutiei de pe linia i a triunghiului

o Restrictia impusa pentru solutie este ca elementul xi al solutiei sa se obtina , prin


deplasarea in triunghi, numai in doua directii, de la elementul anterior, limitand
multimea elementelor din care se alege elementul xi al solutiei numai la
elementele din triunghi care se gasesc intr-o anumita pozitie fata de elementul
anterior al solutiei

o Pentru a respecta principiul optimalitatii, suma elementelor alese anterior


trebuie sa fie maxima

o Subproblemele nu sunt independente deoarece in subproblema i alegerea


elementului xi al solutiei se bazeaza pe alegerile facute in subproblemele
anterioare

DATE SI STRUCTURI DE DATE

1. Pentru numarul de linii aletriunghiului se foloseste variabila n


2. Pentru memorarea triunghiului se foloseste matricea a
3. Pentru memorarea sumelor maxime se foloseste matricea S
4. Pentru memorarea directiei de deplasare se foloseste matricea p
LICEUL TEORETIC ION BARBU Prof. LIVIA MĂRNUNŢELU
Anul şcolar 2011-2012 Clasa a XI-a
DISCIPLINA INFORMATICA 17.03.18

Se folosesc urmatoarele subprograme :


- citeste()- citirea datelor din fisierul text
- init()- initializeaza linia n a matricei S cu elementele de pe linia n a triunghiului
- p_dinamica() – calculeaza valoarea solutiei optime( elemental S 11 al maticei
sumelor)
- afiseaza()- afiseaza suma maxima si solutia problemei folosind informatiile din
matircea p

EXEMPLU

Matricea triunghiului –a
Suma maxima =20

5 0 0 0
4 2 0 0
5 4 3 0
4 6 2 5

Matricea sumelor maxime –S

20 0 0 0
15 1 0 0
11 10 8 0
4 6 2 5

Matricea directiei de deplasare –p

1 0 0 0
1 1 0 0
2 1 2 0
0 0 0 0
LICEUL TEORETIC ION BARBU Prof. LIVIA MĂRNUNŢELU
Anul şcolar 2011-2012 Clasa a XI-a
DISCIPLINA INFORMATICA 17.03.18

II. Dandu-se un sir de numere sa se determine subsirul crescator de lungime


maxima

OBSERVATII

- Multimea datelor de intrare o reprezinta multimea A ={a1,a2,…,an} formata din


elementele sirului

- Valoarea asociata unei solutii este lungimea subsirului crescator.

- Valoarea solutiei optime este valoarea maxima (lungimea subsirului trebuie sa fie
maxima)

- Solutia problemei este data de un vector S={x1,x2,…,xm} unde xi  A.

- Problema poate fi descompusa in subprobleme :

o Subproblema i este de a gasi subsirul crescator de lungime maxima care incepe


cu elementul ai

o Restrictia impusa pentru solutie este ca elementul ai cu care incepe subsirul sa


aiba valoarea mai mica sau cel mult egala cu cea a succesorului sau in subsir (a j),
Iar in multimea A numarul de ordine (i) trebuie sa fie mai mic decat numarul de
ordine al succesorului (j ) limitand multimea elementelor din care se alege
elementul ai
Metoda cea mai simpla de a gasi subsirul d lungime maxima care incepe cu
elementul ai este de a cauta printre subsirurile de lungime maxima descoperite
in subproblemele rezolvate anterior , cel mai lung subsir care incepe cu un
element aj ce poate fi succesor in subsir al elementului ai, obtinandu-se un nou
subsir , de lungime mai mare, care incepe cu elementl ai.
Pentru a respecta principiul optimalitatii, lungimea subsirurilor descoperite
anterior trebuie sa fie maxima

o Subproblemele nu sunt independente deoarece in subproblema i alegerea


subsirului care incepe cu elemental ai al solutiei se bazeaza pe alegerile facute in
subproblemele anterioare

DATE SI STRUCTURI DE DATE


LICEUL TEORETIC ION BARBU Prof. LIVIA MĂRNUNŢELU
Anul şcolar 2011-2012 Clasa a XI-a
DISCIPLINA INFORMATICA 17.03.18

1. Pentru numarul de elemente ale sirului se foloseste variabila n


2. Pentru memorarea sirului de numere se foloseste matricea a
3. Pentru memorarea lungimilor maxime se foloseste matricea L
4. Pentru memorarea indicelui elementului urmator se foloseste matricea p

Se folosesc urmatoarele subprograme :


- citeste()- citirea datelor din fisierul text
- init()- initializeaza elemental n al vectorilor L si p
- p_dinamica() – calculeaza valoarea solutiei optime( lungimea maxima a
subsirurilor care incep cu fiecare element ai din sir )
- cauta_solutia()- cauta cea mai mare lungime maxima a unui subsir pentru a gasi
elemental cu care incepe subsirul
- afiseaza()- afiseaza lungimea sirului gasit si solutia problemei folosind informatiile
din matircea p

indici 1 2 3 4 5 6
a 1 -2 3 2 4 4
L 4 4 3 3 2 1
p 3 3 5 5 6 6
subsirul 1 3 4 4

III. O teava de lungime L trebuie sa se confectioneze din n bucati de teava, fiecare


avand lungimea ai . O bucata de teava nu poate fi taiata. Sa se gaseasca, daca
exista, solutia de a obtine teava de lungime L prin sudarea unor bucati de teava
cu lungimea ai.

OBSERVATII

- Multimea datelor de intrare o reprezinta multimea A ={a1,a2,…,an} formata din


lungimile bucatilor de teava

- Valoarea asociata unei solutii este lungimea tevii.

- Valoarea solutiei optime este L (lungimea tevii construite trebuie sa fie L)

- Solutia problemei este data de un vector S={x1,x2,…,xm} unde xi  A.

- Problema poate fi descompusa in subprobleme :


LICEUL TEORETIC ION BARBU Prof. LIVIA MĂRNUNŢELU
Anul şcolar 2011-2012 Clasa a XI-a
DISCIPLINA INFORMATICA 17.03.18

o Subproblema i este de a gasi toate tevile care se pot confectiona adaugand


bucata de teava cu lungimea ai la tevile care au fost construite in subproblema
anterioara

o Restrictia impusa pentru tevile care se construiesc este ca ele sa nu depaseasca


lungimea L . Aceasta restrictie limiteaza multimea tevilor construite anterior.

o Subproblemele nu sunt independente deoarece in subproblema i construirea


tevilor cu ajutorul bucatii de teava cu lungimea ai se bazeaza numai pe tevile
construite in subproblema anteriara

DATE SI STRUCTURI DE DATE

1. Pentru numarul de bucati de teava se foloseste variabila n, pentru lungimea tevii care
trebuie confectionata, variabila L, iar pentru lungimea maxima a unei tevi care se poate
forma adaugand o noua bucata de teava la tevile construite anterior- variabila max.
Variabila max are initial valoarea 0, iar la sfarsit, daca problema are solutie, are lungimea
L( lungimea tevii cate trebuie construita )
2. Pentru memorarea lungimii fiecatei bucati de teava se foloseste matricea a
3. Pentru memorarea tevilor care se p[ot confectiona se foloseste vectorul T de lungime L

Se folosesc urmatoarele subprograme :


- citeste()- citirea datelor din fisierul text
In fisierul text, pe primul rand sunt scrise:
n- numarul de bucati de teava
L- lungimea tevii
Iar pe urmatorul rand, lungimile celor n bucati de teava
- init()- initializeaza elemental n al vectorului T si variabila max
- p_dinamica() – calculeaza valoarea solutiei optime( lungimea tevilor care se pot
obtine adaugand fiecare bucata de teava ai)
- solutie()-verifica daca s-a gasit solutia problemei
- afiseaza()-daca este posibil sa se confectioneze teava, afiseaza lungimile bucatilor
de teava din care se confectioneaza
LICEUL TEORETIC ION BARBU Prof. LIVIA MĂRNUNŢELU
Anul şcolar 2011-2012 Clasa a XI-a
DISCIPLINA INFORMATICA 17.03.18

L=10
n=5

1 2 3 4 5
2 2 3 5 6
a

Vectorul T
max a(i) 0 1 2 3 4 5 6 7 8 9 10
initial -1 0 0 0 0 0 0 0 0 0 0

0 a(1) -1 0 2 0 0 0 0 0 0 0 0

2 a(2) -1 0 2 0 2 0 0 0 0 0 0

4 a(3) -1 0 2 3 2 3 0 3 0 0 0

7 a(4) -1 0 2 3 2 5 0 5 5 5 5

10 a(5) -1 0 2 3 2 5 6 5 6 6 6

void p_dinamica()
{int i,j,k ;
for(i=1; i<=n; i++)
{for(j=max; j>=0; j--)
if(T[j]!=0 && j+a[i]<=L)
T[j+a[i]]=a[i];
if(max+a[i]<=L) max=max+a[i];
int solutie()
{return T[L]1=0;}
void afiseaza()
{if(! Solutie()) cout<<” Teava nu se poate confectiona”;
else
for(i=L; i!=0; )
{ cout<< “ bucata de “<< T[i]<<” metri “<<endl;
LICEUL TEORETIC ION BARBU Prof. LIVIA MĂRNUNŢELU
Anul şcolar 2011-2012 Clasa a XI-a
DISCIPLINA INFORMATICA 17.03.18

i-=T[i] ;}}

S-ar putea să vă placă și