Documente Academic
Documente Profesional
Documente Cultură
Punctaj
:Punctajultotalcumulataltaskurilordintemaeste10p.
Datapublicare
:30.10.2015
Termenpredare
:13.11.2015,ora23.55(deadlinehard)
Responsabilitema
:GeorgianaCiocirdel,LoredanaGroza,DavidIancu
reverse(s) {
n = lungime(s)
daca n <= 1 {
intoarce s;
} altfel {
intoarce concat(reverse(substring(s, n/2, n)),
reverse(substring(s, 0, n/2)));
}
}
Seconsideracaatatvaloareadereturn,catsiparametrulfunctieisuntsiruridecaractere.
Dupa ce ati gasit functia, aplicati una dintre cele patru metode predatelacurs(iterativa,arbore
derecurenta,substitutiesauMaster)pentruadeterminaclasadecomplexitate.
algoritm_programare_dinamica(criteriu_de_optim, Problema) {
// Fie Problema_0, Problema_1, , Problema_n subprobleme ale
// Problemei transmise ca parametru. Subproblemele se pot
// suprapune (in sensul ca solutia unei probleme P_i participa
// in procesul de constructie a solutiei problemei P_i+1), dar
// sunt similare si scad in complexitate:
// Problema_n mai putin complexa decat Problema, , Problema_1
// mai putin complexa decat Problema_2. Problema_0 este cel mai
// putin complexa si va contribui la solutia initiala.
Solutii = solutii_initiale(criteriu_de_optim, Problema_0)
pentru fiecare problema i
// Se construieste solutia problemei Problema_i cu
// ajutorul solutiilor problemelor Problema_0,
// Problema_1 Problema_(i-1).
Solutie_i = solutii(
Solutii, criteriu_de_optim, Problema_i)
Solutie = Solutie Solutie_i
// La final, se selecteaza sau se reconstruieste solutia finala
// din multimea totala de solutii.
Solutie_finala = solutie_pentru_Problema(Solutii)
intoarce Solutie_finala
Pentru a doua problema a temei, va trebui sa gasiti lungimea
celei mai lungi subsecvente
comun
edintredouasecventedecaracteresisarezolvatitaskurileprezentatemaijos.
Cateva definitii
o
secventa
reprezintaocolectieordonatadeelemente[
a
i]
o
subsecventa reprezinta o
secventa initiala, din care se omit elemente de pe anumite
pozitiisicare,totusi,pastreazaordineainitialarelativaaelementelor
secventei
un
prefix
delungime
k
reprezintaprimele
k
elementealeuneisecvente.
Exemple:
S1 = [1, 2, 3, 4, 5] esteosecventa
S2 = [2, 2, 2, 2, 2] esteosecventa
S1 = [1, 4, 5] esteosubsecventaalui S1
S1 = [1, 2, 3] esteprefixuldelungime k = 3 asecventei S1
[] esteprefixuldelungime 0 altuturorsecventelordemaisus
Algoritmuldeprogramaredinamicadescrisincontinuarerezolvaproblemapentruexempluldat:
Initial, inainte de a aplica orice algoritm, cea mai lunga subsecventa are lungimea 0 si
estesecventavida []
Consideram, pe rand, elementele A[i] si B[j] , unde i si j vorluavaloridela1,panala
lungimeasecventelor A ,respectiv B
Pentru un i si j oarecare, fie A[i] = B[j] , fie A[i] =/ B[j] . Deci vom avea doua cazuri
cetrebuiesctratateseparat
In primul caz ( A[i] = B[j] ), cea mai lunga subsecventa dintre prefixul de lungime i al
secventei A si prefixul de lungime j al secventei B va avea lungimea cu 1 mai mare
decat cea mai lunga subsecventa dintre prefixul de lungime (i 1) al secventei A si
prefixuldelungime (j 1) alsecventei B
In caz contrar ( A[i] =/ B[j] ), nu am gasit o subsecventa mai lunga decat a prefixelor
anterioare ( (i 1) si (j 1) ). Cea mai lunga subsecventa pana la pasul (A[i], B[j]) va
fi maximul dintre cele mai lungi subsecvente descoperite la pasii (A[i 1], B[j]) sau
(A[i], B[j 1]) ,pecareiamparcursinaintesaajungemlapasulcurent.
Sacombinamacestalgoritmsiceldeprogramaredinamicagenerala:
Solutie_ij = 1 + Solutie_(i-1)(j-1)
altfel
Solutie_ij = max (Solutie_i(j-1), Solutie_(i-1)j)
Solutie = Solutie Solutie_ij // pentru a o folosi la
// urmatoarea iteratie
// La final, vom alege cea mai lunga subsecventa obtinuta la
// pasul i = lungime A si j = lungime B, pentru ca ia in
// considerare solutiile tuturor subproblemele ce se pot forma
// din subsiruri ale sirurilor A si B.
Solutie_finala = Solutie_(lungime A)(lungime B)
intoarce Solutie_finala
Folosind acest algoritm, putem, deci, gasi o recurenta care sa descrie problema in functie de
subproblemesimilare.
A = [A, B, G, I, 0, 14, O, O, P , H, 0]
B = [A, I, 0, 14, U, V , Z, 0, P , P , P ]
dimensiunevector1x
dimensiunevector2
Timpdeexecutiealgoritm
programaredinamica
Timpdeexecutiealgoritm
recursiv/bruteforce
In prima coloana treceti dimensiunea primului vector generat x dimensiunea celui deal doilea
vector (ex: |vect 1| = 10, |vect 2| = 2 => veti trece intabel10x2).Adouasiatreiacoloanavor
contine timpul de executie necesari pentru algoritmul de programare dinamica si, respectiv,
pentrucelrecursiv.
Ordonati tabelul dupa dimensiunea totala a tabloului folosit pentru algoritmul de programare
dinamica.
Observatii:
ii. lacomanda
clean
vastergeexecutabilulsioricealtfisiergeneratlacompilare
iii. lacomanda
run
varulaexecutabilulobtinut:
1.
lasati in functia main apelurile catre cele doua functii de gasire a
subsecventeicomunemaxime
2.
vectoriigeneratiicudimensiunimici(sub10fiecare)
3.
lasatiapelulcatrefunctiacareverificadacaceledouafunctiiintorcacelasi
rezultatsiscrietilaconsolaunmesajcorespunzator.
Toate fisierele sursa, precum si Makefileul vor trebui semnate cu numele si grupa
voastrapeprimulrandalfisierului
AdaugatitoatesurselesiMakefileulintrunfolderdenumit
aa-tema1-2
.
Cumsetrimitetema?
Creati o arhiva cu denumirea
nume_prenume_grupa.zip
. De exemplu,
studentul Ana Popescu de la grupa 327CF va crea arhiva
popescu_ana_327CF.zip.
Arhivatrebuiesafie
zip
.
Incarcatiarhivape
cs.curs.pub.ro
.
Cetrebuiesacontinaarhiva?
Un fisier README format
PDF
, care sa fie semnatcu
nume
,
prenumesi
grupa
si sa contina raspunsul la intrebarile si cerintele din enunt. Pentru redactarea
fisierului
PDF
, puteti utiliza, de exemplu, LaTeX sau orice procesor de
documente pentru desktop sau online si in care sa puteti edita ecuatii (exemple
arfi:GoogleDocs,LibreOfficeWriter,MicrosoftWord).
Folderul
aa-tema1-2
, care sa contina sursele si fisierele Makefile cerute la
taskul(2).
Punctare
Punctajul
complet pe fiecare task se acorda doar daca taskul a fost
completsi
corectrezolvat.
Amnotatindreptulfiecaruiexercitiupunctajulsau.Sevaacordasipunctaj
partial
petask:
pentru taskuri incare nusecererezolvarein README,sepoateacordapunctaj partial,
infunctiedecatdemultdintasksarezolvat
pentru taskuri in care se cere cod C, in cazul in care fisierele sursanucompileazasau
nu ruleaza corect (conform specificatiilor din enunt), punctajul maxim pe task va deveni
70% din punctajul maxim specificat anterior si se vaacordapunctajpartial,in functiede
catdemultdintaskafostrezolvat.
Changelog
Enunt problema 2:
Pentru
prima problema a temei, va trebui sa gasiti
cea mai lunga
subsecventa comuna dintre doua secvente de caractere si sa rezolvati task
urile prezentate
mai jos. =>
Pentru
a doua problema a temei, va trebui sa gasiti
lungimea
celei mai lungi
subsecvente comun
e dintre doua secvente de caractere si sa rezolvati taskurile prezentate
maijos.
Problema 2, Task 1:
Descrieti in README un algoritm brute
force sau recursiv
(deci nu cel
dinamic) pentru problema data, rezolvand urmatoarele cerinte
=>
Descrieti in README un
algoritm bruteforce sau recursiv pentru problemadata,rezolvandurmatoarelecerinte
(asadar,
puteti gasi un algoritm bruteforce sau va puteti folosi de ideea algoritmului de programare
dinamicasisaconstruitiunalgoritmrecursiv).
Problema 2, Task3c:
Implementatiofunctiecaresatestezecaceledouametodedelapunctul
(a) si (b) functioneaza corect pe
doua exemple alese de voi: functiile vortrebuisaintoarcade
fiecare data acelasi rezultat
=>
Implementatiofunctiecaresatestezecaceledoua metodede
la punctul
(a) functioneaza corect
pentru un exemplu de doi vectori alesi de voi:functiilevor
trebuisaintoarcadefiecaredataacelasirezultat
Precizari generale pentru trimiterea temei:
Un fisier README format PDF, care sa fie semnat
cu nume, prenume si grupa si sa contina raspunsullaintrebarilesicerinteledinenunt,
precum
si graficul cerut in cerinta (2.2f)
=>
Un fisier README format PDF, care sa fie semnat cu
nume,prenumesigrupasisacontinaraspunsullaintrebarilesicerinteledinenunt.