0% au considerat acest document util (0 voturi)
480 vizualizări10 pagini

Programarea Dinamica

Documentul prezintă principiile de bază ale programării dinamice, cum ar fi evitarea recalculării subproblemelor comune și rezolvarea de jos în sus, de la cele mai mici la cele mai mari subcazuri. De asemenea, oferă un exemplu de aplicare a programării dinamice pentru a găsi cel mai lung subșir crescător într-un șir de numere.

Încărcat de

Andrei Done
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PPT, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
480 vizualizări10 pagini

Programarea Dinamica

Documentul prezintă principiile de bază ale programării dinamice, cum ar fi evitarea recalculării subproblemelor comune și rezolvarea de jos în sus, de la cele mai mici la cele mai mari subcazuri. De asemenea, oferă un exemplu de aplicare a programării dinamice pentru a găsi cel mai lung subșir crescător într-un șir de numere.

Încărcat de

Andrei Done
Drepturi de autor
© Attribution Non-Commercial (BY-NC)
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca PPT, PDF, TXT sau citiți online pe Scribd

PROIECT LA INFORMATICA

PROGRAMAREA DINAMICA
Programarea dinamica face parte dintr-o categorie de metode matematice numite metode de scufundare. O problema de programare dinamica contine subprobleme comune (care nu sunt independente) din a caror rezolvare si combinare se obtine solutia unei probleme mai mari. Deci rezolvarea unei probleme se poate face doar dup solutionarea (sub)problemelor, care alcatuiesc problema respectiva. Spunem ca programarea dinamica actioneaza de jos in sus, prelucrand si combinand subcazuri mici, obtinand astfel solutia pentru subcazuri tot mai mari.

Totodata programarea dinamica evita rezolvarea de mai multor ori a aceleiasi subprobleme (rezolvandu-se doar problemele independente ), prin memorarea rezultatelor partiale.

Nu exista un criteriu pe baza caruia sa identificam cu siguranta o problema pentru rezolvarea careia trebuie sa utilizam metoda programarii dinamice, dar putem formula doua proprietati care sugereaz o solutie prin programare dinamica.

PRINCIPII FUNDAMENTALE ALE PROGRAMARII DINAMICE


Programarea dinamica, ca si metoda divide et impera, rezolva problemele combinand solutiile subproblemelor. Dupa cum am vazut, algoritmii divide et impera partitioneaza problemele in subprobleme independente, rezolva subproblemele

in mod recursiv, iar apoi combina solutiile lor pentru a rezolva problema initiala. Daca subproblemele contin subsubprobleme comune, in locul metodei divide et impera este mai avantajos de aplicat tehnica programarii dinamice.

Sa analizam insa pentru inceput ce se intampla

cu un algoritm divide et impera in aceasta din urma situatie. Descompunerea recursiva a cazurilor in subcazuri ale aceleiasi probleme, care sunt apoi rezolvate in mod independent, poate duce uneori la calcularea de mai multe ori a aceluiasi subcaz, si deci, la o eficienta scazuta a algoritmului.

Primul

principiu de baza al programarii dinamice: evitarea calcularii de mai multe ori a aceluiasi subcaz, prin memorarea rezultatelor intermediare. Al doilea principiu fundamental al programarii dinamice este faptul ca ea opereaza de jos in sus Se porneste de obicei de la cele mai mici subcazuri. Combinand solutiile lor, se obtin solutii pentru subcazuri din ce in ce mai mari, pina se ajunge, in final, la solutia cazului initial.

al treilea principiu fundamental, programarea dinamica este utilizata pentru a optimiza o problema care satisface principiul optimalitatii: intro secventa optima de decizii sau alegeri, fiecare

subsecventa trebuie sa fie de asemenea optima. Cu toate ca pare evident, acest principiu nu este intotdeauna valabil si aceasta se intampla atunci cand subsecventele nu sunt independente, adica atunci cand optimizarea unei secvente intra in conflict cu optimizarea celorlalte subsecvente.

Aplicatie
Fie un sir de n numere naturale. Se cere sa se gaseasca cel mai lung subsir crescator al sau.
Exemplu: irul {2, 4, 3, 5, 3, 6} are cel mai lung subsir crescator de lungime 4: {2, 4, 5, 6} sau {2, 3, 5, 6}. Rezolvare: Soluia problemei nu este unic, dar lungimea maxim a subirului cresctor, da. Vom nota cu L[k] lungimea celui mai lung subir cresctor care ncepe de la poziia k i pn la sfritul irului iniial. Calculm, pe rnd, L[n], L[n-1], L[n-2] L[2], L[1]. Lungimea celui mai lung subir cresctor va fi dat de cea mai mare valoare a lui L. L[n] = 1 L[k] = 1+ max {L[i ], unde k<in i v[k]v[i ]}, k=n-1,1 #include<fstream.h> int v[10000],n,i,L[1000],max,mx,k,t;

Aplicatie (continuare)
int main(){
fstream f("[Link]",ios::in); for(i=1;i<=n;i++) f>>v[i]; L[n]=1; //subsir maxim de lung 1 for(k=n-1;k>0;k--) {mx=0; for(i=k+1;i<=n;i++) if(v[i]>=v[k] && L[i]>mx) mx=L[i]; L[k]=mx+1;

if(L[k]>max)
{max=L[k]; t=k;} }

Aplicatie (continuare)
cout<<"lungimea maxima:"<<max;
//afisarea subsirului cout<<endl<<v[t]<<' '; for(i=t+1;i<=n;i++) if ((v[i]>=v[t]) && (L[i]==max-1)) {cout<<v[i]<<' '; max--;} return 0; }

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