Argument … … … … … 4 [608757]

UNIVERSITATEA “OVIDIUS” CONSTANȚA
FACULTATEA DE MATEMATICĂ ȘI INFORMATICĂ
SPECIALIZAREA: INFORMATICĂ

LUCRARE METODICO -ȘTIINȚIFICĂ
PENTRU OBȚINEREA GRADULUI
DIDACTIC I

TEHNICI DE PROGRAMARE PENTRU PROBLEME DE
OPTIMIZARE

Coordonator științific:
Conf. Univ. Dr. Elena Pelican

Candidat: [anonimizat]. Buturugă (căs. Marin) Mădălina

CONSTANȚA
– 2018 –

2 Cuprins
Argument ………………………….. ………………………….. ………………………….. ………………………….. ………………. 4
Capitolul I. Importanța studierii informaticii în școală ………………………….. ………………………….. …………. 6
Capitolul II. Tehnici de programare pentru probleme de optimizare ………………………….. …………………. 17
A. Metoda Greedy ………………………….. ………………………….. ………………………….. ………………………….. 17
a) Descrierea metodei ………………………….. ………………………….. ………………………….. ………………….. 17
b) Probleme rezolvate prin metoda Greedy ………………………….. ………………………….. ……………… 18
1. Problema spectacolelor ………………………….. ………………………….. ………………………….. ……… 18
2. Problema rucsacului fracționară(continuă) ………………………….. ………………………….. ……….. 21
3. Reactivi ………………………….. ………………………….. ………………………….. ………………………….. . 24
4. Problema instructorului de schi ………………………….. ………………………….. ………………………. 27
5. Subsecvență de sumă maximă ………………………….. ………………………….. ………………………… 29
6. Timpul minim de așteptare ………………………….. ………………………….. ………………………….. … 31
7. Coduri Hu ffman ………………………….. ………………………….. ………………………….. ……………….. 34
8. Algoritmul lui Prim ………………………….. ………………………….. ………………………….. …………… 38
9. Algoritmul lui Kruskal ………………………….. ………………………….. ………………………….. ………. 42
10. Probleme propu se ………………………….. ………………………….. ………………………….. ……………… 47
B. Metoda programării dinamice ………………………….. ………………………….. ………………………….. ……… 51
a) Descrierea metodei ………………………….. ………………………….. ………………………….. ………………….. 51
b) Probleme rezolvate prin metoda programării dinamice ………………………….. ……………………… 53
1) Pachete ………………………….. ………………………….. ………………………….. ………………………….. .. 53
2) Tren ………………………….. ………………………….. ………………………….. ………………………….. ……. 55
3) Subșir crescător maximal ………………………….. ………………………….. ………………………….. …… 58
4) Pietre ………………………….. ………………………….. ………………………….. ………………………….. ….. 60
5) Problema discretă a rucsacului ………………………….. ………………………….. ………………………… 62
6) Subșir comun maximal ………………………….. ………………………….. ………………………….. ……… 64
7). Sumă în triunghi ………………………….. ………………………….. ………………………….. ………………. 67
8). Evaluare optimală ………………………….. ………………………….. ………………………….. …………….. 69
9). Transformare de cuv inte ………………………….. ………………………….. ………………………….. ……. 72
10). Palindrom ………………………….. ………………………….. ………………………….. ………………………… 76
11). Suma ………………………….. ………………………….. ………………………….. ………………………….. ….. 78
12). Lăcusta ………………………….. ………………………….. ………………………….. ………………………….. .. 82
13). Paragrafare optimală ………………………….. ………………………….. ………………………….. …………. 85
14). Scara ………………………….. ………………………….. ………………………….. ………………………….. …… 88
15). Poliție ………………………….. ………………………….. ………………………….. ………………………….. …. 91
16). Probleme propuse ………………………….. ………………………….. ………………………….. ……………… 95
Capitolul IV. Cercul de informatică ………………………….. ………………………….. ………………………….. …….. 99
1. Cercul de informatică – mijloc de dezvoltare al competențelor de aplicare creativă a metodelor
de programare ………………………….. ………………………….. ………………………….. ………………………….. …… 99
2. Metodologia organizării și desfășurării unui cerc ………………………….. ………………………….. …… 100
3. Strategia didactică utilizată în cadrul cercului ………………………….. ………………………….. ……….. 101
3.1 Strategii didactice ………………………….. ………………………….. ………………………….. ………………. 101
3.1.1. Metod a didactică ………………………….. ………………………….. ………………………….. …………….. 103
3.1.2 Procedee didactice ………………………….. ………………………….. ………………………….. ……………. 106
3.1.3. Mijloacele de învățământ ………………………….. ………………………….. ………………………….. …. 107
3.1.4. Moduri de organizare a activității didactice ………………………….. ………………………….. …….. 108
4. Cercetarea pedagogică – „Tehnici de programare pentru probleme de optimizare” în cadrul
cercului de informatică ………………………….. ………………………….. ………………………….. …………………. 110

3 4.1. Etapele proiectării ………………………….. ………………………….. ………………………….. ……………… 110
4.2. Descrierea unor secvențe de lecție ………………………….. ………………………….. ……………………. 116
4.3. Metode de evaluare ………………………….. ………………………….. ………………………….. ……………. 125
4.4. Analiza activității ………………………….. ………………………….. ………………………….. ………………. 127
Concluzii ………………………….. ………………………….. ………………………….. ………………………….. …………… 129
Bibliografie ………………………….. ………………………….. ………………………….. ………………………….. ………… 130
Anexa 1 ………………………….. ………………………….. ………………………….. ………………………….. …………….. 132
Anexa 2 ………………………….. ………………………….. ………………………….. ………………………….. …………….. 136

4 Argument
Societatea de astăzi are mul te modificări importante în programele de educație, școala trebuind
să pregătească elevii pentru a fi capabili să diferențieze termenul de informatică de cel de tehnologia
informației și abia apoi să poată elabora un algoritm pentru rezolvarea unei problem e.
Lucrarea de față îș i propune ca pornind de la structurile de date cele mai uzuale și de la analiza
eficienței algoritmilor să prezinte elaborare a algoritmilor Greedy și programare dinamică pentru
rezolvarea problemelor de optimizare. Motivul principal p entru care am ales această temă este acela că
respectivele tehnici de programare sunt des utilizate în rezolvarea problemelor propuse la concursurile
și olimpiadele de informatică. Îmi doresc ca această lucrare să poată fi un punct de reper pentru elevii
de liceu care își doresc să facă performanță în domeniul informaticii.
Lucrarea al cărei titlu este “Tehnici de programare pentru probleme de optimizare” este
structurată în trei capitole.
În primul capitol se argumentează importanța s tudierii informatici i în școală, dar și importanța
utilizării calculatorului în procesul de învățământ.
Cel de -al doilea capitol este dedicat tehnicilor de programare pentru probleme de optimizare și
este structurat în două subcapitole mari: metoda Greedy și metoda programări i dinamice.
Metoda Greedy (metoda optimului local) este o metodă de programare care se folosește în
probleme de optimizare și care furnizează o singură soluție (optimul global), obținută prin alegeri
succesive ale optimului local. Metoda se aplică pentru tipul de probleme în care care se dă o mulțime
cu n elemente și pentru care trebuie determinată o submulțime a sa, S cu m elemente, care îndeplinesc
anumite condiții. Această metodă este euristică de aceea e nevoie de un rezultat teoretic care să justifice
că procedând astfel, se ajunge la soluția corectă. Pentru anumite probleme, se poate accepta utilizarea
unor algoritmi despre care nu se știe dacă furnizează soluția optimă , dar care furnizează rezultate
“acceptabile” , sunt mai ușor de implementat și mai eficienți decât algoritmii care dau soluția optimă.
Un astfel de algoritm se numeș te euristic.
Una din ideile frecvent utilizate în elaborarea algoritmilor euristici constă în descompunerea
procesului de căutare a soluției optime în mai multe subprocese su ccesive, fiecare din aceste
subprocese constând î ntr-o optimizare. O astfel de strategie nu poate conduce întotdeauna la o soluție
optimă, deoarece alegerea unei soluții optime la o anumită etapă poate împiedica atingerea în final a
unei soluții optime a î ntregii probleme; cu alte cuvinte, optimizarea locală nu implică, în general,
optimizarea globală.
Metoda programării dinamice este o tehnică de programare ce se utilizează tipurile problemele
în care soluție a se construiește dinamic în timp, adică decizi ile care duc la aflarea rezultatului se iau pas
cu pas, folosind deciziilo r de la pasul/pașii anteriori .
De obicei, metoda programării dinamice este adecvată în cazul problemelor care solicită
determinarea unui optim (minim sau maxim), în urma unui proces decizional care se desfășoară în mai
multe etape. Astfel, se pornește de la o stare inițială și la fiecare pas se ia o decizie care determină o
nouă stare, până când se ajunge la soluția finală, optimă. Pentru această metodă cel mai dificil este
găsirea și justificare relației de recurență și stabilirea structurilor de date folosite.
După descrierea generală a metodei Greedy și a metodei de programare dinami că se vor
prezenta descrierile ș i rezolvările pentru cele mai sugestive probleme. La fiecare metodă se vor
prezenta subiecte pentru cercurile de elevi și probl eme pentru olimpiade.

5 Capitolul trei reprezintă partea metodică a lucrării care are în vedere rezolvarea problemelor
prin utilizarea diverselor tehnici, metode și procedee didactice. În ultima perio adă asistăm la o criză a
învățării, la refuzul tinerilor de a aprofunda altceva decât le este necesar la ex amenul de Bacalaureat.
Scopul cercului de informatică este de a -i ajuta pe elevi s ă descopere că informatica nu se limitează la
memorarea unor algori tmi și la rezolvarea unor probleme pentru bacalaureat sau atestat. Această formă
de activitate poate duce la performanță deoarece pune în prim plan elevul. Prin cercul de informatică se
dezvoltă atât competențe de elaborare a algoritmilor cât și de impleme ntare a acestora într -un limbaj de
programare. La nivelul cercului de informatică se pot aplica diverse metode în vederea identificării
metodei de programare adecvate pentru rezolvarea problemei. În prim -plan va fi elevul care ajutat de
profesor, prin apli carea unor metode interactive, va ajunge să analizeze comparativ eficiența diferitelor
metode de rezolvare a aceleiași probleme și alegerea celui mai eficient algoritm de rezolvare.
Obiectivele generale ale cercului de informatică sunt: dezvoltarea interes ului pentru informatică,
învățarea cooperării între elevi și familiarizarea elevilor cu diverse tehnici de programare.

6 Capitolul I. Importanța studierii informaticii în școală
Societatea infor mațională este societatea în care calculatorul particip ă la apr oape toa te
evenimentele de zi cu zi, având în același timp ș i anumite in strumente specifice prin care să îș i
îndeplineasc ă scopur ile, printre care și educația. Activitatea de educaț ie are ca fin alitate și dotarea
oricărui utilizator, elev , cu îndemânările corespunz ătoare pentru a ș ti ce dorește , de unde s ă procure
ceea ce dore ște și ce s ă facă cu ceea ce a ob ținut, aceasta pentru a putea avea un control asupra
"bombardamentului" informa țional. No ua societate î nglobeaz ă numeroase e -activit ăți, printre care și e-
educa ția. Aceasta (e -educa ție sau e -learning) implic ă o interac țiune între procesul educativ și diferite
mijloace electronice – tehnologia informa ției și comunic ării (TIC): casete audio/vid eo, suport extern de
memorie, fax, convorbiri telefonice, trans misii prin radio și televiziune , teleconferin țe, videoconferin țe
și, nu în ultimul r ând, calculatorul și Internet -ul.
Educa ția permanent ă, de-a lungul întregii vie ți, va implica folosirea calculatorului în mod
profesional. Ponderea învățământului deschis , în timp real, este cov ârșitoare. Existen ța calculatorului și
a Internet -ului este o prim ă posibilitate de promovare a acestui tip de educa ție. Rolul profesorului a
devenit mult mai dificil și mai important, iar probleme ca învățarea profesorilor și multi specializarea
vor c ăpăta o importan ță din ce în ce mai mare.
Informatica este în acela și timp o disciplin ă didactic ă, dar și un instrument de instruire pentru
alte discipline de învățământ. Informatica și calculatorul își ocup ă locul ce li se cuvine, at ât ca "obiect
de învățământ ", cât și ca "mijloc de învățământ ". Este necesar s ă-i obișnuim pe elevi s ă aplice no țiunile
informatice de algoritm, schem ă logic ă și program și în cadrul altor discipline școlare. Experien ța
școlar ă până în prezent a validat idee a că algoritmizarea și prezentarea grafic ă a informa ției sunt foarte
accesibile recep ționării și prelucr ării de c ătre cel ce învață .
Asigurarea condi țiilor pentru instruirea asistat ă de calculator se bazeaz ă în primul r ând pe
pregătirea profesorilor și ulterior pe pregătirea elevilor.
Sistemul de învățământ trebuie s ă își coordoneze dezvoltarea, fiind evident faptul c ă unor dotări
tehnice serioase le trebuie alocate și investiții în resursele umane, profesorii fiind cei care îndrum ă pașii
elevilor.
Noile t ehnologii sunt pe cale s ă transforme radical modalit ățile de instruire conven țional ă care
au fost cunoscute și utilizate p ână în prezent. Aceast ă transformare impune, pentru toate categoriile din
sfera de persoane implicate în instruirea de orice tip și nivel, î nsușirea de noi competen țe și abilit ăți.
Competen țele informatice trebuie integrate, ca elemente obligatorii, în curriculumul profesional
al oricărui cadru didactic. Aceste competen țe nu trebuie privite doar ca simple abilit ăți care s ă permit ă
profe sorilor s ă utilizeze anumite instrumente tehnologice și de calcul; dimpotrivă , ele se refer ă la
capacitatea personalului însărcinat cu instruirea de a integra diferitele resurse tehnologice disponibile în
procesul educa țional și în mediul de studiu corespu nzător:
Institu țiile de formare a cadrelor didactice trebuie s ă facă față provoc ării de a preg ăti noi
genera ții de profesori, capabili s ă utilizeze efectiv aceste noi instrum ente de învățare . Programele de
formare trebuie s ă asigure profesorilor abilit ățile necesare integr ării instrumentelor TIC în propriul lor
mediu de instruire, astfel încât să-și poată concepe, planifica și distribui cursurile cu ajutorul acestor
tehnologii, în strânsă legătură cu tehnicile pedagogice, de colaborare și comunicare. Sunt necesare:
 cunoa șterea tehnologiilor de informare și comunicare (TIC)
 structura și pregătirea unei lecț ii electronic e (design, ad ăugarea con ținutu rilor, crearea
de activit ăți practice, crearea de teste)

7  utilizarea uneltelor electron ice de comunicare (ind ividuale, de grup: chat,
videoconfe rințe)
 abilit ăți de utilizare a platformelor e -learning
În ciuda afinit ății pentru chat și jocuri, elevii au recunoscut importan ța rolului educa țional al
calculatorului: ei își doresc s ă îl foloseasc ă la mai multe ore, inclusiv pentru studiul limbilor str ăine,
calculatorul fiind un instrument deosebit de versatil, o platform ă interactiv ă prin care orizontul copiilor
se poate deschide.
Timpul mare petrecut de elevi în fata calculatorului pe de o parte, și preocup ările lor în acest
domeniu pe de alta parte, relev ă necesitatea de a învăța elevii în primul r ând cum s ă utilizeze
calculatorul, pentru a deschide astfel calea spre a învăța prin intermediul calculatorului și pentru a -i
pregăti pentru societatea în care calculatoru l are un rol deosebit.
Școala r ăspunde acestor nevoi prin curriculum informatic la materiile de specialitate,
informatica fiind acum o disciplin ă de studiu la toate profilurile.
Termenul informatică desemnează „știința procesării sistematice a informației , în special a procesării
cu ajutorul calculatoarelor”. Termenul englez corespunzător este Computer Science ( știința
calculatoarelor).[http://ro.wikipedia.org]
Alte c âteva posibil e definiții ale "informaticii" ar putea fi:
a) se ocup ă cu studiul calculatoarelor și al fenomenelor majore din jurul acestora;
b) cuprinde totalitatea cuno ștințelor asupra calculatorului și a calculului av ând componente
teoretice, experimentale și de pr oiectare:
• teorii pentru înțelegerea echipamentelor de calcul, a programelor și sistemelor;
• experimente pentru testarea și dezvoltarea conceptelor;
• metodologii (reguli, metode) de proiectare (algoritmi, unelte pentru aplica ții practice
particulare);
• metode de analiz ă pentru verificarea faptului c ă realiz ările îndeplinesc cerin țele
c) se ocup ă cu studiul reprezent ării și implement ării cuno ștințelor;
d) se ocup ă cu studiul modelelor și al complexit ății acestora;
e) se ocup ă cu studiul sistematic al proceselor algoritmice care descriu și transform ă informa ția
(teoria informa ției), precum și analiza, proiectarea, implementarea și aplicarea acestora.
Scopurile ce sus țin informatic a ca disciplin ă de sine st ătătoare în planurile de învățământ sunt:
o dezvo ltarea capacit ății de utilizare a terminologiei, a unui limbaj informatic specific și
de folosire a tehnicii de calcul în însușirea de noi cuno ștințe;
o înțelegerea informaticii ca mijloc de modelare a fenomenelor realit ății înconjur ătoare și
de simulare a acestora;
o asigurarea nivelului de cultur ă general ă în informatic ă prin parcurgerea principalelor
etape din dezvoltarea informaticii ca știință;

8 o dezvoltarea unei motiva ții intrinseci în studiul informaticii;
o crearea unei atitudini favorabile activit ății de rezolvare a problemelor cu ajutorul
calculatorului, prin deprinderea strategiilor de abordare a acestora și tratarea lor într-un
mod riguros;
o dezvoltarea unor capacit ăți de autoinstruire;
o crearea unei atitudini pozitive privind importan ța informaticii în lumea contemporan ă și
pătrunderea ei în toate domeniile vie ții economico -sociale.
Disciplinele "Informatica" și "TIC" trebuie s ă asigure absolven ților dob ândirea unor cuno ștințe
de informatic ă la nivel de cultur ă general ă, necesare continu ării studiu lui, și a unor cunoștințe cu
caracter aplicativ utile în societatea în care vor tr ăi.
În vederea î ndeplinirii acestor deziderate, obiectivele cadru pentru aceste discipline sunt:
 dezvoltarea deprinderilor de utilizare a unui sistem de calcul și a unor pr oduse soft de larg ă
răspândire;
 dezvoltarea g ândirii algoritmice, a spiritului inventiv și creator;
 dezvoltarea deprinderilor necesare activit ăților individuale și în echip ă
 conștientizarea conexiunilor dintre informatic ă și societate pentru modulul "Teh nologia
informa ției";
 utilizarea surselor informaționale și a mijloacelor de procesare în scopul prelu ării, prelucrării și
prezent ării informa ției ;
 înțelegerea dezvolt ării tehnicii și a implica țiilor tehnologiei informa ției asupra mediului și
societ ății;
 valorificarea termenilor de specialitate în comunicare;
 dezvoltarea capacit ății de cooperare în scopul realizării unei aplica ții.
Curriculum -ul de specialitate permite centrarea pe raționalizarea activit ăților de învățare, în
funcție de obiectivele care sunt formulate în termeni de competen țe și de capacit ăți individuale. De
asemenea, avem la dispozi ție posibilitatea de a propune un curriculum (curriculum la decizia școlii)
care ofer ă o palet ă largă de activit ăți prin care elevul î și poate acoperi sfera p roprie de interese.
La baza acestei discipline se afla trei concepte fundamentale: informa ția, algoritmul și calculatorul.
„Scopul disciplinelor informatice este acela de a asigura formarea unor reprezent ări privind
regulile și metodele necesare rezolv ării problemelor cu calculatorul, de formare a deprinderilor
necesare pentru utilizarea calculatoarelor, de înțelegere a rolului calculatoarelor în diferite activit ăți
economice -sociale și a perspectivelor de dezvoltare a tehnicii de calcul”.
(Sava, Simona – Teorie și practic ă în educa ția la distan ță)
Informatica și calculatorul au p ătruns în toate domeniile permeabile algoritmiz ării.
Învățământ ul, acumul ând până în prezent un mare număr de algoritmi, precum și o bogat ă tehnic ă de
calcul, solicit ă ajutorul i nformaticii și calculatoarelor pentru optimizarea procesului de predare –
învățare, pentru dezvoltarea caracterului s ău practic – aplicativ și a creativit ății la elevi.

9 Folosirea calculatorului în procesul de învățământ a marcat procesul reformei în învăț ământ ,
atunci când dezvoltarea limbajelor la nivel înalt a făcut posibil ă scrierea de programe logice. Ulterior s –
a realizat cuplarea mijloacelor audio – vizuale cu informatica – textul cuplat cu sunet și imagine,
ducând la apari ția programelor informatice educa ționale, iar în prezent, o dat ă cu apari ția Internetului și
a tehnicii multimedia, la lec ții multimedia.
Pedagogia modern ă pornind de la caracteristicile culturii actuale și de la necesit ățile societ ății,
preconizeaz ă cu insisten ță trecerea de la școala informativ ă la școala formativ ă.
În condi țiile în care volumul cunoștințelor , în toate domeniile a crescut, s -au depus eforturi s ă
fie restructurat și recondi ționat fondul existent, s ă se stabileasc ă corela ții între cuno ștințe, să se
sistematizeze ri guros materialul , în special în informatic ă, timpul de t recere de la o descoperire
științifică până la aplicarea ei în tehnic ă devine din ce în ce mai scurt. Omul modern este omul obi șnuit
cu efortul propriu de studiu continuu pe tot parcursul vie ții pentr u a se putea adapta mai u șor și eficient
la noile profesiuni, la noile condi ții de munc ă și viață.
Formarea capacit ății de învățare constituie unul dintre scopurile principale ale instruirii generale
cât și al instruirii profesionale. Deci, în școală, trebuie s ă îi form ăm pe elevi în așa fel încât să fie
capabili a se orienta singuri într-un câmp de probleme noi.
Pentru a -și îndeplini rolul formativ, școala nu trebuie s ă pună pe elev în postura unui simplu
receptor de cuno ștințe gata sistematizate ci tre buie s ă-l stimuleze s ă gândeasc ă și să lucreze prin
eforturi personale.
Realizarea unui învățământ formativ ( învățământ centrat pe individualitatea elevului ce asigur ă
formarea continu ă a elevilor, folosind strategii și metode didactice eficiente), folosi rea pentru
îndeplinirea acestui scop ca metod ă principal ă problematizarea, perfec ționarea modurilor de a
interpreta și de a aplica aceast ă metod ă, constituie problema central ă a școlii contemporane. Se
consider ă deci c ă obiectivul de baz ă al educa ției mode rne îl constituie dezvoltarea proceselor
intelectuale, în special dezvoltarea g ândirii, în compara ție cu metodele expozitive. Procesele
intelectuale ce se pot dezvolta folosind aceste metode sunt : spiritul de observație, memoria, gândirea,
imaginația, cre ativitatea.
Spiritul de inițiativă al elevilor, interesul lor pentru știință și activitate practic ă se dezvolt ă în
mod deosebit în cadrul rezolv ării unor sarcini independente, bine înțeles sub îndrumarea și conducerea
profesorului. Profesorul are rolul de a da elevului în clasa un volum de cuno ștințe precise , dar mai are
și datoria de a -l conduce pe drumul greu de la ne știință la știință .
În școală elevii trebuie învățați cum s ă învețe, de aceea lec țiile se alc ătuiesc a șa încât să le
trezeasc ă interesul și participarea .
Trecând de la reprezent ări la no țiuni abst racte, esen țial pentru profesor este s ă-i îndrume pe
elevi cum s ă tragă singuri concluziile din materialul faptic prezentat.
Exista multiple și variate posibilit ăți de activizare a elevilor în scopul de a dezvolta la aceștia o
gândire logic ă și flexibil ă, aceasta fiind o cerin ță de baz ă a învățământ ului modern. În învățământ ul
modern trebuie stabilit ă "conexiunea invers ă
cât mai complet și aceasta se poate realiza prin
îmbinarea metodelor clasice cu cele moderne.
Calculatorul asigur ă baza necesar ă pentru studiul la nivel calitativ superior a numeroaselor
discipline din planul de învățământ . Astfel folosirea calculatorului în predarea unor discipline permite :
intuirea mai profund ă a unor no țiuni, mo delarea unor obiecte și procese complexe greu de urmărit și de

10 înțeles în absen ța calculatorului, sporirea gradului de participare a elevului la lec ție, stimularea lucrului
individual.
Mai nou, lec țiile multimedia folosite în predarea limbilor str ăine, a g eografiei, biologiei sau
istoriei, sunt deosebit de complexe și interesante cuprinz ând at ât text c ât și imagine și sunet.
Prezentarea acestor lecții necesit ă calculatoare performante care au instalate: plac ă grafic ă
corespunzătoare , plac ă de sunet, CD play er, boxe, etc. Activitatea elevului prin utilizarea lec țiilor
multimedia este mai bine dirijat ă spre ac țiune, exploatare și descoperire personal ă.
Calculatorul ofer ă tehnologiilor didactice un caracter interactiv. Prin intermediul programului
didactic, pr ofesorul realizeaz ă un permanent dialog între calculator și cel care învață.
Atât pentru profesor c ât și pentru elev limbajul de programare trebuie s ă fie cât mai simplu.
Folosirea calculatorului solicit ă un studiu aprofundat al temei și spirit de cercet are al elevului.
Necesitatea realiz ării algoritmului și a programului de rezolvare a problemei solicit ă cunoa șterea
perfect ă a teoriei. Conceptul de învățare și aplicare cap ătă în acest context o noua calitate – cu accent
pe activitatea formativ ă, partici pativ ă și anticipativ ă a elevului. Folosirea calculatorului permite o
dilatare a sferei de cuprindere a fenomenului studiat, și în acela și timp o comprimare a timpului folosit
pentru studiu.
Calculatorul acorda dreptul la eroare a celui care învață punându-i la dispozi ție comentariile și
explica țiile necesare continu ării lec ției.
Dialogul dintre calculator și cel care învață trebuie s ă fie cat mai apropiat de dialogul profesor –
elev, de și nu va atinge total aceast ă performan ță.
"Însușindu -și în fața calcu latorului o serie de cuno ștințe, elevul se formeaz ă pe calea
educației permanente, învață să-și aprecieze calitatea și durata preg ătirii, învață să învețe.
Informatica și calculatorul dezvolt ă spiritul algoritmic, programatic, opera țional și
organizatoric, rigoare în raționament și exprimare precis ă, caracterul intensiv al muncii și
spiritul aplicativ" . (Fulea, Teodora – Tehnologii informaționale în procesul de predare -învățare a
informaticii)
Folosirea calculatorului poate optimiza învățarea rapid ă a unor meserii, este nelipsit în munca
de cercetare și conducere, în informarea documentar ă, în toate domeniile premergătoare algoritmizării .
Calculatorul ca mijloc de învățământ permite o noua form ă de prezentare a lec țiilor, ilustrarea
lor practic ă și integra rea cu cercetarea . Calculatorul nu poate însă înlocui profesorul, dup ă cum cartea
nu a putut face s ă dispar ă lecția de clas ă și nici nu se poate substitui celorlalte mijloace de învățământ .
Pe plan mondial calculatoarele au p ătruns în toate domeniile de ac tivitate, deci și învățământ ,
devenind indispensabile.
Internetul permi te comunicarea pe to t mapamondul. Nu este suficient un calculator și un set de
programe să ducă la un învățământ autonom la domiciliu . Este posibil s ă se produc ă înstrăinarea
individul ui, ca urmare a petrecerii unui timp îndelungat în fața calculatorului, acest fenomen de
înstrăinare și însingurare fiind tot mai frecvent mai ales în rândul tinerilor.
Într-adev ăr, educa ția nu se poate reduce la informatic ă și calculator, și aici interv ine rolul
învățământ ului și al profesorului.
Practica arat ă că pe măsura dezvoltării tehnicii și tehnologiei învățământ ului, sarcinile școlii și
profesorilor cresc.

11 Astăzi este evident c ă apari ția calculatorului și informaticii a sporit mult puterea științei și
tehnologiei, eficien ța muncii științifice, posibilitatea aplic ării rapide în practic ă a con ținutului
informa țional. Informatic a a devenit un factor important a l progresului contemporan. Preg ătirea
organizat ă a tinerei genera ții în domeniul informat icii î și va aduce contribu ția la dezvoltarea
componentei tehnice a învățământ ului și educa ției și la umanizarea continu ă a acestei componente prin
procesul muncii creatoare și al educa ției permanente.
Experien ța dob ândită în domeniul instruirii asistate de calculator permite s ă se afirme deja c ă
exist ă o afinitate natural ă a copiilor pentru noua tehnologie.
Ținând cont de faptul c ă în toate domeniile de activitate s -au introdus de cur ând calculatoare, un
om poate fi considerat alfabetizat numai în cazul în care are cuno ștințe minimale de informatic ă și
deprinderi practice de utilizare a calculatorului. Deci a fost o necesitate obiectiv ă de introducere a
informaticii în activitatea instructiv – educativ ă din școli și din afara școlilor , aceasta pr esupune dot area
corespunzătoare a școlilor, preg ătirea cadrelor didactice și a instructorilor, experimentarea și validarea
unor programe de instruire teoretic ă și practic ă a copiilor, realizarea unor studii și cercet ări
interdisciplinare.
În învățământul tehnic, res tructurarea gamei profesiunilor va avea modific ări importante în
sistemul de pregătire profesional ă. Deosebirile dintre învățământ ul tehnic și celelalte forme de
învățământ se vor atenua.
În educa ție trebuie efectuate unele modificări pentru utilizarea opt imă a calculatoarelor în
scopul cre șterii eficienț ei procesului de instruire și educa ție, precum și completarea sistemului
cunoștințelor de bază .
"Deci în viitor, studiul disciplinelor fundamentale și informaticii va avea un rol hot ărâtor
în formarea cadr elor didactice. Tehnologia educa țional ă pentru studiul informaticii este
determinat ă prin obiectivele educa ționale ale acestei discipline, prin con ținutul care
trebuie însușit, prin mijloacele care asigur ă învățarea, prin modelul de proces în cadrul
căruia se va face învățarea și prin evaluarea obiectivelor propuse".
(Fulea, Teodora – Tehnologii informa ționale în procesul de predare -învățare a
informaticii)
Următoarele aspecte trebuie luate în considerare atunci c ând se proiecteaz ă și se realizeaz ă un
proce s educa țional :
– pătrunderea informaticii în toate domeniile de activitate;
– înglobarea criteriilor economice;
– necesitatea unei preg ătiri noi, simultan în tehnic ă și în informatic ă sau în tehnic ă, informatic ă și
conducere;
– determinarea factorilor care condiț ionează procesul instruirii;
– formularea ipotezelor cu privire la categoriile din care fac parte rela țiile de studiat;
– proiectarea experimentului (stabilirea etapelor, a ordinii lor și a mijloacelor nec esare).
Proiectarea unui act de învățare, oricare ar fi întinderea acestuia (lec ție, capitol) presupune
înțelegerea profund ă a obiectivelor generale de c ătre profesor și elaborarea de c ătre acesta a
competențelor particulare specifice etapei respective, cunoa șterea performan țelor ini țiale ale elevilor, a

12 capac ităților acestora, delimitarea acelei p ărți din con ținutul general al disciplinei care poate fi însușită
de către elevi în etapa aleas ă, a mijloacelor de care se vor folosi ace știa în timpul învățării, alegerea
metodelor și procedeelor, elaborarea fluxului sarcinilor pentru elevi și a celor de dirijare și, în sfârșit , al
instrumentelor de evaluare a probei cu care se va stabili în ce măsură s-a realizat ce s -a propus.
Competențele generale care asigur ă unitate pe plan na țional în învățarea informaticii sunt acele
capacit ăți care trebuie formate la elevi în anii în care studiaz ă.
În acest context, prin competențele disciplinelor de informatic ă se evidenț iază:
– sistematizarea aspectelor algoritmice ale noțiunilor studiate în matematic ă;
– însușirea no țiunilor de bază privind algoritmizarea;
– formarea reprezent ărilor referitoare la posibilit ățile de automatizare a execu ției algoritmului;
– consolidarea laturilor practic e și tehnic i ale algoritmizării , legate de implementarea concret ă a
algoritmilor pe microcalculatoa re pentru diverse probleme date;
– cunoa șterea bazelor tehnicii moderne de calcul pornind de la studiul principiilor de operare
ale microcalculatoarelor;
– însușirea no țiunilor fundamentale și a metodelor de elaborare a programelor într-un limbaj de
programare ;
– formarea reprezentărilor privind etapele de solu ționare a problemelor cu ajutorul
calculatorului;
– cunoașterea principalelor domenii de utilizare a tehnicii de calcul și rolul ei în dezvoltarea
societ ății;
Competențele derivate care asigur ă diversitatea învățării informaticii, trebuie s ă aibă un caracter
comportamental și se vor formula de fiecare profesor în funcție de particularită ții.
Caracterul comportamental al un ei competențe va fi a sigurat de următorii indicatori :
 Cine va m anifesta comportamentul vi zual (elevul, grupa, clasa) ?
 Care sunt componentele observabile care demonstreaz ă atingerea competenței ?
 Care sunt produsele acestor componente?
 Care sunt criteriile care permit evaluarea produsului a șteptat?
Putem formula c âteva î ndrum ări/reguli pentru pr oiectarea unui soft educa țional, cele mai multe ținând
seama de calea prin care ne propunem s ă producem învățarea:
 elevul va fi informat despre ceea ce va învăța; cunoa șterea de c ătre elev a competențelor
urmărite , a performan țelor pe care va trebui s ă le realizeze, spore ște motiva ția și favorizeaz ă
învățarea;
 se vor folosi posibilit ățile oferite de calculator – grafic ă, anima ție, culoare etc. -pentru captarea și
menținerea aten ției;
 pentru a realiza o continuare logica a învățării , se vor reactualiza cuno ștințele predate anterior,

13  printr -o testare ini țială se va verifica faptul c ă elevul nu posed ă încă elementele ce constituie
obiectul învățării din softul respectiv;
 materialul de învățat va fi introdus în succesiunea:
 prezentarea informațiilor și procedeelo r de lucru
 exemple de sarcini rezolvate
 sarcini de lucru pentru elev
 calculatorul va reac ționa la fiecare răspuns al elevului, oferind un evantai larg de reacții
adaptate, diferite.
Indiferent de pozi ția teoretic ă pentru care opt ăm, în tot timpul proiectăr ii softului educa țional
trebuie s ă nu pierdem din vedere răspunsurile pe care le -am formulat sau s ă ne punem următoarele
întrebări fundamentale demersului didactic:
 Care este obiectivul pedagogic?
 Ce activit ăți intelectuale trebuie sa încerc ăm să provoc ăm la elev pentru a realiza acest obiectiv
de o maniera durabil ă și cu maximum de șanse pentru a favoriza transferul?
 Care este forma de interacțiune cea mai bine adaptat ă pentr u a servi ca suport pentru acea stă
activitate?
Numai după aceste prime clarific ări, chiar dac ă încă nu avem r ăspunsurile adecvate sau chiar
dacă încă mai exist ă multe aspecte nel ămurite, putem s ă intrăm în problemele specifice interac țiunii
elev-software educa țional.
Toate aceste elemente definitorii pentru un software educa țional se vo r materializa de o maniera
specific ă, pas cu pas, pe parcursul realiz ării proiectului pedagogic și a transpunerii acestuia în program
(soft) educa țional.
La rândul lor, profesorii se pot concentra pe domeniile lor de activitate, pe dezvoltarea
materialelor educative și pot colabora între ei pentru a oferi leg ături între diversele domenii.
Evident c ă aceste noi concepte în educa ție nu le pot înlocui pe cele tradi ționale în mod radical.
Îmbinarea tradi ției cu no ul poate conduce la aplatizarea decalajului ce e xistă la nivel cultural și
educa țional sau între cultura tehnic ă și educa ția practic ă.
"Practicarea unui învățământ total deschis reprezintă un țel greu de atins prin mijloacele
educa ției tradi ționale datorit ă costurilor uriașe ale metodelor tradi ționale, situa ția se poate schimba în
momentul în care se face apel la metodele moderne bazate pe tehnologiile informatice și pe cele ale
telecomunica țiilor, folosind mijloacele multimedia. Aceste tehnologii pot elimina o mare parte din
constr ângerile de timp, acce sul restrictiv la informa ție datorat distan țelor și costurilor adi ționale
educa ției. " (Conferin ța naț ional ă de Învățământ Virtual – www.portal.edu.ro )
„A ști nu este î ndeajuns; este nevoie s ă aplic ăm.
A dori nu es te suficient, trebuie s ă acționăm.”
(Johann von Goethe)
Creativitatea este o capacitate complex ă și fundamental ă a personalit ății care sprijinindu -se pe
date sau produse anterioare în îmbinarea cu investiga ții și date noi, produce ceva nou, original, de

14 valoare și eficien ță științifică și social ă, adic ă a posibilit ăților persoanei și a condi țiilor ambiente, ale
mediului socio -cultural.
Ea poate fi considerat ă ca "aptitudine a intelectului de a elabora idei, trăiri , metode noi
originale".
Elementele princi pale ce caracterizeaz ă creativitatea sunt :
 flexibilitatea ;
 noutatea și originalitatea ;
 fluen ța;
 senzitivitatea ;
 ingeniozitatea ;
Creativitatea ca rezultat al stimul ării și activit ății înseamn ă "acumulă ri de capacit ăți, abilit ăți și
posibilit ăți de realizar e a ceva nou, original în plan ideal – abstract ca și, dup ă caz, în plan practic, deci
inventivitatea ideatic ă și practic ă".
(Cerghit, I. – Metode de învățământ )
Problemele apar atunci c ând așteptările noastre au fost înșelate, c ând teoriile noastre duc l a
dificult ăți, la contradicț ii, iar acestea pot surveni înăuntrul unei teorii, între dou ă teorii diferite, sau ca
urmare a ciocnirii dintre teoriile și observa țiile noastre. Problema este cea care ne provoac ă să
împingem mai departe cunoa șterea, s ă experim entăm și să observ ăm.
Se spune că o întrebare devine problem ă atunci c ând genereaz ă o stare psihic ă de curiozitate, de
nedumerire, de uimire sau incertitudine în fața unui obstacol ce trebuie învins, a unor dificult ăți
teoretice sau practice de depășit , de rezolvat în fața nout ății, a necunoscutului.
În adevăratul ei sens o problem ă sau situa ție are un caracter de ipotez ă, iar rezolvarea ei în sine
este tocmai drumul con știent străbătut de la ela borarea ipotezei la verificarea și adaptarea ei .
"O mare des coperire științifică sau o mare opera de art ă este desigur rezultatul unei
activit ăți de elaborare și rezolvare de probleme. Solu ția la o problem ă îi vine g ânditorului în
mod frecvent sub forma unei sclipiri de intui ție, de și, poate, un timp, el a întors problema pe
toate fetele. Actele creatoare se bazeaz ă pe un volum mare de cuno ștințe însușite anterior. Orice
descoperitor propune un „ salt inductiv ”, o combinare a ideilor din sisteme de cunoa ștere
diferite, o folosire îndrăzneață a analogiilor, presupune un mare volum de deprinderi
intelectua le, capacitate ce nu pot fi dobâ ndită decât prin elaborări și rezolv ări de probleme c ât
mai variate".
(Cerghit, I. – Metode de învățământ )
Rezolv ând un mare număr de probleme în condi ții relativ constante, g ândirea aj unge la structuri
rigide și are posibilitatea de a opera numai în cadrul limitat de condi ții.
Dacă aplica țiile se extind în condi ții variate, g ândirea dobândeș te mai mult ă suple țe și capacit ăți
de adaptare.
Lărgirea domeniului de aplicabilitate formeaz ă capacit ăți cum ar fi: capacitatea de transfer,
capacitatea de a deriva idei noi dintr -o idee principal ă, capacitatea de a explica și interpreta fenomene

15 noi prin prisma no țiunilor învățate, capacitatea de a concretiza ideile și de a le raporta la cazuri
particulare sau generale, într-un cuvânt se dezvolt ă însușiri fundamentale ale creativit ății, adic ă
flexibilitatea g ândirii.
Gândirea creatoare este, aceea care "creeaz ă sau elaboreaz ă mijloace, procedee pentru
rezolvarea unor tipuri de probleme . Cu c ât numărul și varietatea problemelor la care pot fi aplicate
mijloacele nou create sunt mari, cu atât creativitatea este mai mare. " (Cerghit, I. – Metode de
învățământ )
Ea particip ă la elaborarea instrumentelor de cunoa ștere, a mijloacelor de rezolvare a
problem elor teoretice și practice în timp ce g ândirea productiv ă se folose ște de aceste mijloace în
funcționalitatea ei.
Când vorbim despre creativitate în procesul de informatic ă trebuie sa ne g ândim la crearea
propriului sistem de cunoștințe într-un domeniu.
Cultivarea creativității presupune lupta cu stereotipurile. Problemele pe care le rezolva elevii
trebuie s ă fie diverse ca mod de prezentare, dar încadrabile în algoritmi de rezolvare de anumite tipuri.
În fața oric ărei probleme elevul trebuie pus în situa ția de a g ândi ca în fața unei probleme noi și numai
după acest act de g ândire ( cunoaștere , eventual recunoa ștere a problemei pe baza elementelor esen țiale)
să poată trece la încadrarea problemei individuale în categoria sau tipul de probleme c ăruia îi apa rține.
Pentru a forma la elevi o g ândire creatoare ei trebuie pu și în situa ții variate, mereu noi. În acest
scop se folosesc o mul țime de procedee, dezvoltarea și completarea treptat ă a unei probleme cunoscute,
rezolvarea unei probleme folosind mai multe procedee, și apoi alegerea celei mai economice metode.
Important este gradul de independen ță ce se acord ă elevilor și rezolvarea problemei ca o activitate
unitar ă care conduce la g ândirea creatoare concentrat ă.
Procesul de învățământ poate fi caracterizat ca o învățare creativă atunci c ând elevii devin
participan ți activi la lec ție, c ând se folosesc metode active cum sunt : învățarea prin descoperire,
problematizarea studiului de caz, situa ții în care elevii pot avea iniț iative, pot discuta și propune solu ții
personale.
Toate aceste argumente pledeaz ă atât pentru predare despre calculator c ât și pentru predare cu
ajutorul calculatorului. Av ând în vedere procesele realizate at ât în ceea ce prive ște construc ția
echipamentelor cât și realizarea de programe, es te facilitat ă introducerea pe scar ă largă și eficient ă a
calculatorului în întreaga sfera a proceselor de predare -învățare.
O contribu ție esen țială la constituirea instruirii programate a avut -o cibernetica, at ât de mare
încât se poate afirma c ă instruirea asistată este o aplicare a ciberneticii la organizarea și desfășurarea
instruirii. Prin explicarea procesului de învățământ ca sistem cu comand ă și control (cu autoreglare) și
prin aplicarea conexiunii inverse ca principiu al oric ărei ac țiuni eficiente în organizarea procesului de
învățare, instruirea asistată și-a lărgit și adâncit baza ei teoretic ă și a căpătat mari virtu ți aplicative.
O prim ă idee fundamental ă în instruirea asistată const ă în afirmarea necesit ății fragment ării
dificult ăților. Aceast ă fragmentare se face pe baza unor analize riguroase și chiar prin stabilirea pe baza
de calcul a cantit ății de informa ție necesar ă și suficient ă pentru dep ășirea unei dificultăț i.
O a doua idee const ă în realizarea adapt ării învățării la particularit ățile ind ividului. Dac ă acest
principiu este destul de vechi în pedagogie, realizarea lui rămâne , de multe ori un deziderat. Prin
instruirea programata acest principiu se realizeaz ă fără posibilitatea de abatere. Mai mult, el se poate
realiza și ca adaptare la ritm ul de avansare în cunoa ștere al elevilor, dar și ca adaptare la diferen țele
calitative ale proceselor intelectuale.

16 Instruirea programat ă asigur ă participarea activ ă și conștientă a elevilor în procesul didactic și îi
ajută să depășească fiecare dificultat e întâlnită în învățare, moda litățile de realizare a acestei idei fiind
diferite în raport cu metoda de programare ce se adopt ă.
O alta idee const ă în divizarea dificult ăților și stabilirea ordinii acestora se realizează în conformitate cu
competențele definite de c ei ce realizea ză programa. Conexiunea invers ă este o concepție nouă, impusă
de cibernetică . Cu ajutorul i nstruir ii programat e se susține informarea operativ ă privind efectul învățării
atât pentru elev, cât și pentru profesor , în funcție de dificu ltăți fie prin confirm ări, fie prin infirm ări.
Instruirea programat ă asistat ă de calculator poate s ă ne ajute s ă învățăm să gândim mai bine și
să ne î nsușim metodele de creativitate, să învăță m cum s ă dobândim cunoștințele necesare pentru a fi
mai buni, m ai creativi, și mai eficienți specialiș ti.
Prin efort propr iu de a opera cu informaț iile primite, desigur c ă asupra lor ac ționeaz ă mulți
stimuli, dezvolt ându-le capacitatea intelectual ă care determin ă însușirea cuno ștințelor.
Tehnologia didactic ă în care s-a integrat instruirea programat ă poate s ă obțină dirijarea
comportamentelor în așa fel încât să fie cât mai a proape de cerin țele comen zii sociale. Ea a demonstrat
ca:
 elevul se acomodeaz ă la un stil de munc ă activ, superior ca eficiență ;
 activitatea ind ependent ă este considerabilă ;
 elevul este î nvățat și interesat s ă înving ă greut ățile, devine perseverent în învățare ;
 productivitatea î nvățării este mare datorit ă ritmului individual de munc ă și a tehnicilor folosite ;
 apar capacit ăți de orientare -documenta re în interpretarea datelor ;
 se lucreaz ă sistematizat, se valorific ă informa țiile și datele primite, se aplic ă în practic ă cele
învățate și se cunoa ște o dezvoltare semnificativ ă în ceea ce prive ște imagina ția tehnic ă;
Rezultate ob ținute pot asigura gener alizarea acestei metode la toate obiectele de specialitate ,
unde sunt condiț ii reale de introducere a unor elemente de instruire programat ă și se pot structura
lecțiile printr -o tehnologie didactic ă nouă.

17 Capitolul I I. Tehnici de programare pentru problem e de optimizare
A. Metoda Greedy
a) Descrierea metodei
Aceasta este o metodă de implementare a algoritmilor , ea permite determinarea unei singure
soluții care corespunde unui anumit criteriu optim, în ca zul problemelor în care soluția de construiește
ca submulți me a unei mulțimi date.
Această metodă ea se aplică pentru tipul de probleme în care se dă o mulțime X conținând n
date de intrare și se cere determinarea unei submulțimi Y pentru care sunt îndeplinite condiții
prestabilite . De obicei se pot determina mai multe mulțimi , în cerință există o condiție conform căreia ,
dintre toate submulțimile posibile, se păstrează o singură soluție (optimă) ca rezultat final.
Totalitatea soluțiilor au proprietate a de tranzitivitate astfel : dacă submulțimea Y
X este o
soluție posibilă și Z
Y, atunci și Z este o soluție posibilă. Plecăm întotdeauna de la premisa că
mulțimea vidă este o soluție posibilă.
Metoda aceasta abordează problemele în două moduri ce diferă prin ordinea de execu tare a
instrucțiunilor.
a) Pornim de la mulțimea vidă. Alegem pe rând, după un anumit criteriu , un element din mulțimea
X care nu a fost ales anterior . Alegerea acestuia și adăugarea lui la soluția parțială construită
până în acel moment duce la o soluție po sibilă, elementul se adaugă și el soluției parțiale .
Algoritm ul în pseudocod este următorul :
algoritm Greedy1(X,n,Y )
YØ
pentru i 1.n executa
Alege(X,i,a )
Posibil(Y,a ,v)
daca v=1 atunci Adauga(Y,a )
sfârșit daca
sfârșit pentru
sfârșit algoritm

Subprogramu l Alege returnează în mod dinamic elementul a=xj
{xi,…,x n} și realizează
interschimbarea elementelor xi și xj. Funcția Posibil returnează v=1 dacă Y
{a} este o soluție
posibilă și v=0 altfel . Funcția Adauga construiește noul Y cu Y
{a}.
b) Modul de abordare este asemănător cu diferența că se stabilește de la început ordinea în care
trebuie prelucrate elementele mulțimii X. Algoritmul corespunzător este:
algoritm Greedy2(X,n,Y )
YØ
Prel(X)
pentru i 1.n executa
Posibil(Y,x i,v)
daca v=1 atunci Adauga(Y,x i)
sfârșit daca
sfârșit pentru
sfârșit algoritm

Funcția Prel realizează o prelucrare a elementelor mulțimii X după un criteriu stabilit .

18 Metoda Greedy nu determină toate soluțiile posibile ș i aleage soluția optimă conform criteriului
dat, ea selectează pe rând câte un element îl introduce în soluția optimă doar dacă verifică condiția de
optimizare cerută ; așa se explică și denumirea metodei Greedy (lacom).
Algoritmul construiește soluția pas cu pas pornind de la mulțimea vidă și adăugând la această
mulțime elementul cel mai potrivit, conform cerinței de selecție.
De fiecare dată când dorim să adăugăm un element vom verifica dacă noua mulțime constituie o
soluție posibilă.
Dacă algoritmul va funcționa corect, prima soluție va fi soluția optimă a problemei, dar nu este
și unica soluție.
O clasă de probleme specifică o constituie problemele de optimizare. Astfel, pentru
determinarea maximul unei funcții de cost abordarea metodei este de a aleg e la fiecare pas element ul
care crește cât mai mult costul respectivei funcți i.
Observații :
 Metoda Greedy nu returnează soluția optimă pentru orice tip problemă. Atunci când soluția
returnată nu este optimă trebuie să știm în ce măsură suntem apropiați de soluția optimă.
 Pentru fiecare problemă în parte, după ce se identifică un algoritm, este obligatoriu să se
demonstreze că acesta conduce la soluția optimă.
 Demonstrația faptului că se ajunge la soluția optimă este specifică fiecărei probleme în parte.

b) Probleme rezolvate prin metoda Greedy
1. Problema spectacolelor
La un festival m anagerul artistic trebuie să aleagă o mulț ime cât mai vastă de spectacole ce se
pot desfășura în singura sala pe care este disponibilă . S-au propus n (n<= 100 ) spectacole și
fiecar e spectacol are stabilit un intervalul orar în care poate avea loc [Si,Fi] (Si reprezint ă ora de
început, iar Fi ora de final (numere întregi) al spectacolului i),realizați un program care să permită
susținerea unui număr maxim de spectacole.
Datele de intr are se g ăsesc în fișierul spectacole.in , pe prima linie avem numărul de spectacole, iar
pe următoarele n linii perechi de numere întregi separate prin câte un spațiu, care reprezintă ora de
început și ora de sfârșit a unui spectacol.
Implementarea metodei Greedy
Se folosesc următoarele date și structuri de date:
– Pentru numărul elementelor celor două mulțimi se folosesc variabilele n – numărul de
spectacole (numărul de elemente ale mulțimii A) și m – numărul de spectacole selectate pentru a
forma soluția pr oblemei (numărul de elemente ale mulțimii B)
– Pentru mulțimea spectacolelor se folosește vectorul a, ale cărui elemente sunt de tip înregistrare
– care conține trei câmpuri, x și y pentru ora la care începe spectacolul, respectiv ora la care se
termină spec tacolul și k pentru numărul spectacolului.

19 – Soluția (mulțimea B) va fi memorată în vectorul s. În fiecare element al vectorului s se
memorează indicele elementului selectat din vectorul a, după ce a fost sortat după criteriul
candidatului optim – ora de ter minare a spectacolelor .
Se folosesc următoarele subprogram e:
– Subprogramul citeste() – pentru citirea datelor din fișier și reali zarea vectorului de activități a.
– Subprogramul sort() – sortează crescător vectorul a după ora de terminare a spectacolelor.
– Subprogramul greedy () – implementează strategia pentru această problemă .
– Subprogramul afiseaza () – afișează soluția problemei folosind informațiile din vectorul s.
Metoda Greedy este implementată astfel:
Pas1. Se inițializează vectorul s cu indicele primului element din vectorul a.
Pas2. Pentru următoarele n-1 elemente ale vectorului a, execută
Pas3. Dacă ora la care începe spectacolul din elementul curent al vectorului a este mai mare sau
egală cu ora la care se termină ultimul spectacol adăugat la soluție, a tunci spect acolul este adăugat
la soluție.
spectacole.in spectacole.out
8
9 11
12 13
8 10
10 12
16 18
14 16
20 22
19 21
Planificarea spectacolelor este:
Spectacolul 3 incepe la ora 8 si se termina la ora 10
Spectacolul 4 incepe la ora 10 si se termina la ora 12
Spectacolul 2 incepe la ora 12 si se termina la ora 13
Spectacolul 6 incepe la ora 14 si se termina la ora 16
Spectacolul 5 incepe la ora 16 si se termina la ora 18
Spectacolul 8 incepe la ora 19 si se termina la ora 21
Vectorul a (mulțimea specta colelor) :
Spectacol 1 2 3 4 5 6 7 8
Ora începere 9 12 8 10 16 14 20 19
Ora terminare 11 13 10 12 18 16 22 20
Vectorul a sortat :
Spectacol 3 1 4 2 6 5 8 7
Ora începere 8 9 10 12 14 16 19 20
Ora terminare 10 11 12 13 16 18 21 22

20 Soluția problemei – vectorul s
Spectacol 3 4 2 6 5 8
Ora începere 8 10 12 14 16 19
Ora
terminare 10 12 13 16 18 21

Codul programului C++:
#include <fstream>
#include <iostream>
using namespace std;
struct activitate{int x,y,k;};
activitate a[20];
int n,m,s[20];
fstream f(" spectacole.in" , ios::in);
fstream g("spectacole.out" , ios::out);
void citeste()
{int i;
f>>n;
for(i=1;i<=n;i++) { f>>a[i].x>>a[i].y; a[i].k=i;}
f.close();}
void sort()
{int i,j;
activitate aux;
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(a[i].y>a[j].y) {a ux=a[i];a[i]=a[j];a[j]=aux;}}
void greedy()
{int i,j; s[1]=1; j=1;
for(i=2;i<=n;i++)
if(a[i].x>=a[s[j]].y){j++;s[j]=i;}
m=j;}
void afiseaza()
{g<<"Planificarea spectacolelor este:"<<endl;
for(int i=1;i<=m;i++)
g<<"Spectacolul "<<a[s[i]].k<<" incepe la or a "<<a[s[i]].x<<" si se termina la ora "<<a[s[i]].y<<endl;}
int main()
{ citeste();sort();greedy();afiseaza();}

21 2. Problema rucsacului fracționară(continuă)
Avem la dispoziție un rucsac ce poate duce maxim M kilograme și de N obiecte, caracterizate
fiecare prin greutate și valoare, ce trebuie introduse în rucsac.
Să se realizeze un program care umple rucsacul, astfel încât căștigul total să fie maxim . Putem
introduce oricâte obiecte și fracții (bucăți) din obiecte .
Date de intrare
Fișierului de intrare rucsac.in are pe prima linie două numere, primul fiind N, iar al doilea M (numărul
de obiecte și greutatea maximă admis ă în rucsac ). Pe următoarele N linii se găsesc, despărțite printr -un
spațiu valoarea obiectului curent și greutatea acestuia.
Date de ie șire
Fișierul rucsac.out numărul de ordine al obiectului selectat , precum și procentul în care acesta poate fi
introdus în rucsac.
Exemplu
rucsac.in rucsac.out
5 100
1000 120
500 20
400 200
1000 100
25 1 2 100
4 79
5 100
Implementarea metodei Greedy
Soluția problemei va fi reprezentată de un vector x. Obiectele se vor ordona descresc ător ținând cont de
valoarea/greutate. Cât timp obiectele încap î n rucsac acestea vor fi introduse în întregime. Completăm
rucsacul cu un fragment din următorul obiect ce nu a fost deja selectat.
Se folosesc următoarele subprograme:
– Subprogramul citeste() – pentru citirea datelor din fi șier și realizarea vectori lor o, val, greu .
– Subprogramul sort() – sortează crescător vectorul o după val/greu .
– Subprogramul greedy () – implementează strategia pentru această problemă.
– Subprogramul afiseaza () – afișează soluția problemei folosind informațiile din v ectorul x.
Metoda Greedy este implementată astfel:
– Pas1 . Parcurg vectorul greu , pentru fiecare obiect cu greutatea mai mică decât greutatea
maximă selectez obiectul astfel: x[o[i]]=1 , iar greutatea maximă scade Gr-=greu[o[i]] .
– Pas2. Dacă rucsacul nu a fost umplut,se mai parcurge odată vectorul x și selectăm primul obiect
neselectat x[o[i]]=(Gr*100)/greu[o[i]] .
o 0 1 2 3 4
val 1000 500 400 1000 25
greu 120 20 200 100 1

22 val/greu 8.33 25 2 10 25
După apelul subprogramului sort() vectorul o devine:
o 1 4 3 0 2
După apelul subprogramului greedy() se construiește vectorul x:
x 1 1 0.79 0 0
Codul programului C++:
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("rucsac.in");
ofstream g("rucsac.out");
int o[100],N,M;
float val[100],greu[1 00],x[100],Gr;
void citeste()
{ int i;
f>>N>>M;
for (i=0;i<N;++i)
{
o[i]=i;
f>>val[i]>>greu[i];
}
f.close();}
void sort()
{ int i,aux,schimb;
do
{
schimb=0;
for (i=0;i<N -1;++i)
if (val[o[i]]/greu[o[i]]<val[o[i+1]]/greu[o[i+1]])
{
aux=o[i];
o[i]=o[i+1];
o[i+1]=aux;
schimb=1;
}}while (schimb);}
void greedy ()
{ int i;
for (i=0,Gr=M;i<N && Gr>gr eu[o[i]];++i)
{
x[o[i]]=1;
Gr-=greu[o[i]];
}
if(Gr>0)
for(i=0;i<n&&Gr>0;i++)
if(x[o[i]]==0) {x[o[i]]=(Gr*100)/greu[o[i]];Gr=0;} }

23 void afisare()
{ int i;
for (i=0;i<N;++i)
if (x[i]) g<<i+1<<" "<<x[i]*100< <endl;
g.close();
}
int main()
{
citeste();
sort();
greedy ();
afisare();
return 0;
}
Observa ție
Putem demonstra că algoritm este corect doar dacă putem încărca în rucsac un fragment al unui obiect.
Dacă trebuie să încărcăm obiectul doar în întregime (varianta discretă a problemei rucsacului)
algoritmul Greedy nu mai funcționează. De exemplu, pentru n=3, G=10, greu=(8, 6, 4),
val=(8, 6, 4) , cu algoritmul Greedy se obține soluția x=(1, 0, 0) , iar greutatea obținută este
8. Dar pentru soluția x=(0, 1, 1) obținem greutatea 10, ceea ce însemnă că aceasta este soluția
optimă. Această problemă o vom studia în capi tolul de programare dinamică.

24 3. Reactivi
Într-un laborator avem N reactivi. Pentru a nu avea loc accidente sau reacții ale reactivilor, ei
trebuie s ă fie stoca ți în condi ții de mediu speciale. Fiecare reactiv x, are dat un interval de
temperatur ă [min,max] pentru a fi stocat în condiții optime . Reactivii depozitați în frigidere.
Fiecare frigider poate fi setat la o anumită temperatura (num ăr întreg de grade Celsius).
Realizați un program care s ă stabilească num ărul minim de frigidere necesare pentru
stocare a reactivilor chimici.
Date de intrare
În fișierul de intrare reactivi.in avem :
 pe prima linie num ărul natural N, care reprezint ă numărul de reactivi.
 pe fiecare dintre următoarele N linii se afla min max (două numere întregi separate printr -un
spațiu). Nu merele de pe linia x+1 reprezint ă temperatura minim ă, respectiv temperatura
maxim ă de stocare a reactivului x.
Date de ieșire
În fișierul reactivi.out , vom avea o singur ă linie cu numărul minim de frigidere care pot fi utilizate
pentru stocare optimă a tut uror reactivilor .
Restric ții
 1 ≤ N ≤ 8000.
 Temperatura minim ă, respectiv maxim ă a fiecărui reactiv sunt cuprinse în intervalul [-100,100] .
 Un frigider poate con ține un num ăr nelimitat de reactivi.
Exempl e
reactivi.in reactivi.out
3
-10 10
-2 5
20 50 2
4
2 5
5 7
10 20
30 40 3
5
-10 10
10 12
-20 10
7 10
7 8 2

25 Implementarea metodei Greedy
Se folosesc următoarele subprograme:
– Subprogramul citeste() – pentru citirea datelor din fișier și realizarea vectorilor ti și tf, care
reprezintă temperatura minimă și temperatura maximă pentru fiecare reactiv.
– Subprogramul sort() – sortează intervalele de temperatură crescător după temperatura minimă și
descrescător după temperatura maximă.
– Subprogramul greedy () – implementează strategia pentru această problemă.
Metoda Greedy este implementată astfel:
Se deschide primul un frigider și se introduce primul reactiv în acest frigider. Pentru frigiderul
respectiv reținem temperatura minimă și temperatura maximă .
Parcurg em reactivii (în ordine) verific ăm dacă poate fi introdus în frigiderul respectiv. Dacă
intersec ția dintre intervalul de temperatură al frigiderului și intervalul de temperatură al reactivului să
fie nevidă introducem reactiv ul în frigider și actualiz ăm intervalul de temperatură al frigiderului. Altfel ,
deschide m un frigider nou și setăm intervalul de temperatură al acestui frigider cu intervalul reactivului
plasat în el .
0 1 2 3 4
ti -10 10 -20 7 7
tf 10 12 10 10 8
După apelul subprogramului sort() vectorii devin:
0 1 2 3 4
ti -20 -10 7 7 10
tf 10 10 10 8 12
În urma apelul subprogramului greedy() în frigiderul numărul 1 se vor introduce primii patru reactivi,
deoarece toți au intervalul de temperatură cuprins între -20 și 10 grade, iar pentru ultimul reactiv se va
deschide un frigider nou.

26 Codul programu lui C++:
using namespace std;
fstream fin("react.in", ios::in);
fstream fout("react.out",ios::out);
int N;
int ti[8000], tf[8000];
void citeste()
{ int i;
fin>>N;
for (i=0;i<N;i++) fin>>ti[i]>>tf[i];
fin.close();
}
void sort()
{ int i,j,poz,max;
for (i=N -1; i>0; i –)
{for (poz=i, j=0; j<i; j++)
if (ti[j]>ti[poz] ||ti[j]==ti[poz] && tf[j]<tf[poz]) poz=j;
max=ti[poz];ti[poz]=ti[i]; ti[i]=max;
max=tf[poz];tf[poz]=tf[i]; tf[i]=max; }
}
int greedy()
{ int nf, poz, miny, maxx, i, j, icx, icy;
nf=1; icx=ti[0];icy= tf[0];
//parcurg ceilalti reactivi in ordine
for (i=1; i<N; i++)
{miny=icy;if (miny>tf[i]) miny=tf[i];
maxx=icx;if (maxx<ti[i]) maxx=ti[i];
if (maxx <= miny)
{icx=maxx;icy=miny;}//actualizez intervalul de temperatura
else //deschid un nou frigider
{nf++;
icx=ti[i];icy=tf[i]; }}
return nf;}
int main ()
{ int f;
citeste();
sort();
f=greedy();
fout<<f<<' \n';
fout.close(); return 0;} }

27 4. Problema instructorului de schi
Un instructor dispune de n perechi de schiuri ( n
50) pe care trebuie să le împartă celor la n
elevi ai săi .
Realizați un program care să împarte cele n perechi de schiuri având grijă ca suma
diferențelor absolute dintre înălțimea elevului și lungimea schiurilor distribuite fiecăruia să fie
minimă.
Date de intrare
Datele se citesc dintr -un fișier text care are pe prima linie un număr n, pe următoarea linie n numere
naturale reprezentând lungimile schiurilor (în cm) ș i pe ultima linie n numere naturale reprezent ând
înălțimile elevilor ( în cm).
Date de ieșire
Fișierul de ieșire instructor.out va conține n linii pe care este scris lungimea schiului, înălțimea elevului
și diferența absolută dintre înălțime și lungime .
Exemplu
instructor.in instructor.out
5
140 115 125 155 130
122 167 190 146 152 115-122=7
125-146=21
130-152=22
140-167=27
155-190=35
Implementarea metodei Greedy
Se sorteaz ă crescător schiorii după înălțime. Se sortează crescător schiurile după l ungime.
Asociem primul schior c u prima pereche de schiuri din ș irurile sortate, apoi al doilea schior cu a doua
pereche de schiuri, etc.
Se folosesc următoarele subprograme:
– Subprogramul citeste() – pentru citirea datelor din fișier și realizarea vectorilor a și b, care
reprezintă lungimile schiurilor pe care le are la dispoziție instructorul și înălțimile elevilor.
– Subprogramul sort() – sortează schiurile după lungime și schiorii după înălțime .
– Subprogramul greedy () – implementează strategia pentru această problemă.
Metoda Greedy este implementată astfel:
Asociem prima pereche de schiuri primului schior, apoi a doua pereche celui de -al doilea
schior, etc. până am terminat de asociat .

28 Parcurg em succesiv schiurile și înălțimile , scriem în fișierul de ieșire asocierea făcută și
diferența absolută dintre acestea .
0 1 2 3 4
a 140 115 125 155 130
b 122 167 190 146 152
După apelul subprogramului sort() vectorii devin:
0 1 2 3 4
a 115 125 130 140 155
b 122 146 167 152 190
Codul programului C++:
#include< fstream> // antetul pt scriere ș i citire din fiși er
#include<math.h>
using namespace std;
fstream fin("instructor.in ", ios::in);
fstream fout("instructor.out", ios::out);
int n;
int a[50], b[50];

void citeste()
{ int i;
fin>>n;
for (i=0;i<n;i++) fin>>a[i];
for (i=0;i<n;i++) fin>>b[i];
fin.close();}
void sort(int a[], int n)
{ int i,j,aux;
for(i=0;i<n -1;i++)
for(j=i+1 ;j<n;j++)
if(a[i]>a[j]) {aux=a[i];a[i]=a[j];a[j]=aux;}}
void greedy()
{for(int i=0;i<n;i++)
fout<<a[i]<<" -"<<b[i]<<"="<<abs(a[i] -b[i])<<endl;
}
int main()
{citeste();
sort(a,n);
sort(b,n);
greedy();
system("pause");
return 0;}

29 5. Subsecven ță de sumă maximă
Se dă un șir S=(s1, s2, .., s N) de lungime N. O subsecvență a șirului este de forma: (si, si+1, …, s j)
cu 1 ≤ i ≤ j ≤ N, iar suma subsecvenței este si+si+1+ … + sj.
Să se determine o subsecventa de elemente consecutive si, s i+1, …, s j, astfel încâ t suma
elementelor din subsecven ță să fie maxim ă.
Date de intrare
Fișierul de intrare ssm.in conține un număr natural N pe prima linie , reprezentând lungimea șirului.
Următoarea linie conține N numere întregi separate printr -un spațiu, reprez entând în ordine elementele
șirului.
Date de ieșire
În fișierul de ieșire ssm.out se vor tipări trei numere în această ordine: suma subsecvenței de sumă
maximă, indicele de început și indicele de sfârșit.
Restricții
 1 ≤ N ≤ 6 000 000
 Pentru 20% dintre test e: 1 ≤ N ≤ 1 000 .
 Pentru încă 20%: 5 000 ≤ N ≤ 30 000 .
 Pentru restul de 60%: 100 000 ≤ N ≤ 6 000 000 .
 Dacă există mai multe subsecvențe candidate la soluție, atunci se va tipări cea cu indicele de
început cel mai mic, iar în caz de egalitate cea mai scurtă .
 Se garantează că toate rezultatele intermediare și cel final vor putea fi reprezentate pe întregi cu
semn pe 32 de biți.
Exemplu
ssm.in ssm.out
7
5 -6 3 4 -2 3 -3 8 3 6
13
1 10 3 -5 4 2 -100 30 15 25 -10 40 1000 1000 7 13
Implementarea metodei Greedy
Subsecvența de sumă maximă este: (3, 4, -2, 3), a cărei sumă 3 + 4 – 2 + 3 = 8 este maximă dintre toate
cele N*(N -1)/2 subsecvențe ce se pot forma.
Prima rezolvare care ne vine în minte are complexitatea O(N3) și constă în determinarea sumei fiecărei
subse cvențe posibile și reținerea maximului acestor sume. Este evident că anumite sume parțiale sunt
calculate de mai multe ori.

30 Putem reduce complexitatea la O(N2) ținând cont de faptul că suma subsecvenței s[i..j] este egală cu
suma subsecvenței s[i..j-1], la care se adună s[j]. Păstrăm într -un șir sum[i] suma elementelor din
subsecvența s[1..i] . Pentru a determina suma elementelor din subsecvența s[j..i] facem diferența:
sum[i] – sum[j -1].
Ideea poate fi rafinată calculând pentru fiecare indice i numărul best[i], reprezentând subsecvența de
sumă maximă cu capătul drept în i. Este ușor de observat că best[i] = max(sum[i] – sum[j -1]), unde j ia
valori de la 1 la i. Relația anterioară se mai poate scrie: best[i] = sum[i] – min(sum[j -1]). Obținem
astfel un algorit m liniar care ne determină subsecvența de sumă maximă cerută.
sum[0] = 0;
for (i = 1; i <= N; i++) sum[i] = s[i] + sum[i -1];
min = sum[0];
bestSum = -INFINIT;
for (i = 1; i <= N; i++) {
best[i] = sum[i] – min;
if (min > sum[i]) min = sum[i];
if (bestSum < best[i]) bestSum = best[i];
}
O altă metodă de calcul poate fi dedusă folosind paradigma Divide et Impera . La fiecare pas
împărțim șirul în jumătate și aflăm subsecvențele de sumă maximă din cele două jumătăți. După aceea
trebuie să găsim subse cvența de sumă maximă ce are un capăt în fiecare din cele două jumătăți ale
șirului . Pentru aceasta alipim sufixul de sumă maximă a primei jumătăți cu prefixul de sumă maximă a
celei de a doua.
Pentru a calcula suma elementelor din subsecvenț a de la st la dr, vom folosi suma deja calculată a
elementelor de la st la dr-1. Secven ța de instruc țiuni care rezolv ă cerin țele problemei devine:
for (Smax=s[0], st=0; st<n; st++)
for (Sum=0,dr=st; dr<n; dr++)
{Sum += s[dr];
if (SMax < Sum) {SMax=Sum; poz=st; Lg=dr -st+1;}
În acest caz, numărul de operaț ii efectuate de algoritm este comparabil (ca ordin de mă rime) cu n2.
O dată cu parcurgerea vectorului s de la stânga la dreapta, se va memora suma maximă calculată
până la momentul curent în variabila SMax . În variabila Sum este reținută suma elementelor
subsecvenței curente. Elementul s[i] va fi înglobat în subsecvența curentă dacă Sum+s [i] ≥0. Dacă
Sum+s [i] <0, înglobarea lui x[i] în orice subsecvență ar conduce la o subsecvență cu suma elementelor
mai mică decât cea maximă până la momentul curent, prin urmare s[i] trebuie ignorat, iar noua
subsecvență curentă va incepe la poziția următoare . Mai exact, la pasul i: SMax=max{ SMax, Sum} .
Secven ța de instrucțiuni care rezolva cerin țele problemei devine:
for (SMax=Sum=x[0 ],st=poz=0, Lg=i=l; i<n; i++)
if (Sum < 0) //noua subsecventa incepe pe poziția i
{Sum = x[i]; st=i;}
else //inglobez x[i] in subsecventa curenta
{Sum += x[i];
if (SMax<Sum)//subsecventa_curenta este maximală
Smax=Sum;poz=St;Lg=i -st+l;
}

31 În acest caz, nu mărul de operații efectuate de algoritm este comparabil (ca ordin de mărime) cu n.
Spunem că algoritmul a devenit liniar.
Codul programului C++:
#include <fstream>
using namespace std;
int main ()
{int x[50], n, i, st, dr, poz, Lg, Sum, SMax;
fstream f ("ssm.in",ios::in);
fstream fout("ssm.out",ios::out);
f>>n;
for (i=0; i<n; i++) f>>x[i];
for (SMax=Sum=x[0],st=poz=0, Lg=i=1; i<n; i++)
if (Sum < 0) //noua subsecventa incepe pe poziția i
Sum = x[i], st=i;
else //inglobez x[i ] in subsecventa curenta
{Sum += x[i];
if (SMax<Sum) //subsecventa curenta este maximala
SMax=Sum; poz=st; Lg=i -st+1;}
fout<<"Suma maxima ="<< SMax<<endl;
fout<<" Poziția de inceput a secventei, poziția de sfarsit a secventei "<<poz+1< <" "<<Lg+poz;
return 0;}
6. Timpul minim de așteptare
La un restaurant nou deschis sunt prezente mai multe persoane. Clienții pot comanda din
meniu câte o specialitate . Dar restaurantul are un singur bucătar, care prepară mâncărurile una
după alta, deci clien ții nu pot fi serviți decât pe rând. Știind că bucătarul se apucă de gătit după ce
s-au strâns toate comenzile, realizați un program care stabi lește în ce ordine trebuie pregătite
comenzile , astfel încât timpul mediu de așteptare al clienților să fie minim .
Date de intrare
In fișierului meniu.in pe prima linie avem un număr natural n, ce reprez intă numărul de clienți . Pe linia
următoare avem n numere întregi, reprezentând timpul necesar pentru prepararea fiecărei comenzi, în
ordine pentru cele n persoane.
Date de ieșire
Fișierul meniu.out va conține două linii. Pe prima linie se va afișa un număr real cu 2 zecimale,
reprezentând timpul mediu de așteptare, iar pe a doua linie se vor scrie n numere naturale, reprezentând
numerele de ordine ale persoanelor din restaurant în ordinea în care au fost servite.

Restricții
 1<= n <=1000
 1<= t <=100
 dacă sunt mai multe soluții se va afișa una singură

32 meniu.in meniu.out
5
30 40 20 25 60 86.00
3 4 1 2 5
Implementarea metodei Greedy
Se folosesc următoarele subprograme :
– Subprogramul citeste() – pentru citirea datelor din fișier și realizarea vectorului a, care
reprezintă timpul de așteptare pentru prepararea comenzii fiecărui client.
– Subprogramul sort() – sortează crescător timpii de preparare ai fiecărei comenzi.
– Subpr ogramul greedy () – implementează strategia pentru această problemă.
Pentru a minimiza timpul mediu de așteptare ( timp mediu) va trebui să minimizăm timpul total de
așteptare ( timp total) al persoanelor pentru a fi servite, deoarece timp mediu= timp total/n. O persoană va
trebui să aștepte prepararea meniului ei și a tuturor persoanelor care vor fi servite în fața lui. Intuitiv,
dacă o persoană care doreș te un me niu sofisticat este servită înaintea uneia al cărei meniu se prepară
mai repede, timpul total de aște ptare al celor doi este mai mare decât dacă servirea s -ar fi făcut invers.
De exemplu, pentru timpii 30 și 20, în prima situație timp total= 30 + (30 + 20) , iar în a doua situație
timp total = 20 + (20 + 30) .
În concluzie, vom alege persoanele în ordinea cr escătoare a timpilor de preparare a
meniurilor, ceea ce necesită ca ele să fie ordonate crescător în funcție de acest criteriu și vom calcula
timpul total de așteptare ca fiind suma timpilor de așteptare a fiecărei persoane.
În situația în care există mai multe durate egale de preparare, nu contează ordinea alegerii
acestora.
Pentru fișierul dat, în urma apelului subprogramelor citeste() și sort() vectorii a și b vor
deveni:
a 30 40 20 25 60
b 20 25 30 40 60
După apelul subprogramului greedy(), timpul tot al de așteptare va fi calculat astfel:
t=0+20*5+25*4+30*3+ 40*2+60=430
Timpul mediu se va calcula împărțind t la n, adică 430/5=86

33 Codul programului C++:
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("meniu.in");
ofstream fout("men iu.out");
int n,a[100],j,b[100],t;
void citeste()
{ int i;
fin>>n;
cout<<"n="<<n<<endl;
for (i=1;i<=n;i++) fin>>a[i];
fin.close();}
void sort()
{ int i,j,aux;
for( i=1; i<=n; i++)
b[i]=a[i];
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if(b[i]>b[j])
{aux=b[i];b[i]=b[j];b[j]=aux;}}
void greedy()
{int i;
for(i=1;i<=n;i++)
t=t+b[i]*(n -i+1);
fout<<"Timp de asteptare optimizat ";
fout<<(double)t/n<<endl;
fout<<"Ordinea optima de servire:";
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(b[i]==a[j])
fout<<j<<" ";}
int main()
{
citeste();
sort();
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
cout<<endl;
for(int i=1;i<=n;i++) cout<<b[i]<<" ";
greedy();
system("pause");
return 0;
}

34 7. Coduri Hu ffman
Codurile Huffman reprezintă o tehnică foarte utilizată și eficientă pentru compactarea
datelor; în funcție de caracteristicile fișierului care trebuie comprimat, spațiul economisit este
între 20% și 90%. Algoritmul greedy pentru realizarea acestei codificări utilizează un tabel cu
frecvențele de apariție ale fiec ărui caracter. Ideea este de a utiliza o modalitate optimă pentru
reprezentarea fiecărui caracter sub forma unui șir binar.
Să presupunem că avem un fișier ce conține 100.000 de caractere, pe care dorim să îl memorăm într -o
formă compactată. Frecvențele d e apariție ale caracterelor în text sunt date de figura de mai jos: există doar
șase caractere diferite și fiecare dintre ele apare de 45.000 de ori.
a b c d e f
Frecvență (în mii) 45 13 12 16 9 5
Cuvânt codificat; lungime fixă 000 001 010 011 100 101
Cuvânt codificat; lungime variabilă 0 101 100 111 1101 1100
Există mai multe modalități de reprezentare a unui astfel de fișier. Vom considera problema
proiectării unui cod binar al caracterelor (pe scurt cod) astfel încât fiecare caracter este reprezenta t
printr -un șir binar unic. Dacă utilizăm un cod de lungime fixă, avem nevoie de 3 biți pentru a
reprezenta șase caractere: a=000, b=001, …, f=101 . Această metodă necesită 300.000 de biți pentru a
codifica tot fișierul. Se pune problema dacă se poate fac e o compactare și mai bună.
O codificare cu lungime variabilă poate îmbunătăți semnificativ performanțele, atribuind
caracterelor cu frecvențe mai mari cuvinte de cod mai scurte iar celor cu frecvențe mai reduse cuvinte
de cod mai lungi. Figura de mai jos prezintă o astfel de codi ficare; șirul 0 având lungimea de 1 bit
reprezintă caracterul a în timp ce șirul 1100 de lungime 4 reprezintă caracterul f. Această codificare
necesită (45·1+13·3+12·3+16·3+9·4+5·4)·1.000 = 224.000 biți pentru a reprezenta un fișie r și
economisește aproximativ 25% din spațiu. Vom vedea că aceasta este de fapt o codificare -caracter
optimă pentru acest fișier.
Fiecare frunză este etichetată cu un caracter și cu frecvența de apariție a acestuia. Fiecare nod intern
este etichetat cu sum a ponderilor frunzelor din subarborele aferent.
(a) Arborele corespunzător codificării de lungime fixă a=000, …, f=101
(b) Arborele asociat codificării prefix optime a=0, b=101,…, f=1100.

35 Coduri pre fix
Considerăm doar codificările în care nici un cuvânt de cod nu este prefixul altui cuvânt. Astfel
de codi ficări se numesc codificări pre fix. Se poate arăta că o compresie optimă a datelor, realizată prin
codificarea caracterelor, poate fi realizată și prin codificarea prefix, deci considerarea codific ării prefix
nu scade din generalitate.
Codificarea este întotdeauna simplă pentru orice codificare binară a caracterelor; se
concatenează cuvintele de cod reprezentând fiecare caracter al fișierului. De exemplu, prin codi ficarea
prefix având lungime variab ilă din figura de mai sus , putem codi fica un fișier de 3 caractere abc astfel:
0·101·100=0101100 , unde semnul “·” reprezintă operația de concatenare.
Decodi ficarea este de asemenea relativ simplă pentru codurile pre fix. Cum nici un cuvânt de
cod nu este p refixul altuia, începutul oricărui fișier codi ficat nu este ambiguu. Putem deci să
identi ficăm cuvântul inițial de cod, să îl “traducem” în caracterul original, să -l îndepărtăm din fișierul
codificat și să repetăm procesul pentru fișierul codi ficat rămas. În exemplul nostru, șirul 001011101 se
translatează automat în 0·0·101·1101 , secvență care se decodi fică în aabe .
Procesul de decodi ficare necesită o reprezentare convenabilă a codi ficării pre fix astfel încât
cuvântul inițial de cod să poată fi ușor ident ificat. O astfel de reprezentare poate fi dată de un arbore
binar ale cărui frunze sunt caracterele date. Interpretăm un cuvânt de cod binar pentru un caracter ca
fiind drumul de la rădăcină până la caracterul respectiv, unde 0 reprezintă “ mergi la fiul stâng” iar 1
“mergi la fiul drept .
O codi ficare optimă pentru un fișier este întotdeauna reprezentată printr -un arbore binar
complet, în care fiecare vârf care nu este frunză are doi fii.
Construcția unui cod Hu ffman
Huffman a inventat un algoritm greedy care construiește o codi ficare pre fix optimă numită
codul Hu ffman. Algoritmul construiește arborele corespunzător codi ficării optime, într -o manieră
“bottom -up”. Se începe cu o mulțime de |C| frunze și se realizează o secvență de |C|−1 operații de
“fuzionări” p entru a crea arborele final.
În algoritmul în pseudocod care urmează, vom presupune că C este o mulțime de n caractere și
fiecare caracter c∈C este un obiect având o frecvență dată f[c]. Va fi folosită o coadă de priorități
pentru a identi fica cele două o biecte cu frecvența cea mai redusă care vor fuziona. Rezultatul fuzionării
celor două obiecte este un nou obiect a cărui frecvență este suma frecvențelor celor două obiecte care
au fuzionat.

Huffman(C)
1: n←|C|
2: Q←C
3: pentru i←1,n−1 execută
4: z ← Aloc ă-Nod()
5: x←stânga[z]← Extrage -Min(Q)
6: y ←dreapta[z]← Extrage -Min(Q)
7: f[z]←f[x]+f[y]
8: Inserează(Q,z)
9: returnează Extrage -Min(Q)

36 Pașii algoritmului Hu ffman pentru frecvențele date în figura inițială:

Codul programului C++:
#include <bits/stdc++ .h>
#include <fstream>
using namespace std;
//constructia unui nod al arborelui binar
struct Node {
char data; // caracterul memorat in nod
unsigned frecv; //numarul de apartii ale carcterului
Node *st, *dr; // fiu stanga si dreapta ai nodului respe ctiv
Node(char data, unsigned frecv)
{
st = dr = NULL;
this->data = data;
this->frecv = frecv;
}
};
//compararea a doua noduri
struct compare {

int operator()(Node* l, Node* r)

{
return (l ->frecv > r ->frecv);
}
};
//afi seaza codurile Huffman prin parcurgerea arborelui binar construit
void printCodes(struct Node* rad, string str)
{
if (!rad)

37 return;

if (rad ->data != '$')
cout << rad ->data << ": " << str <<endl;

printCodes(rad ->st, str + "0") ;
printCodes(rad ->dr, str + "1");
}

// Construim un arbore Huffman si scriem codurile parcurgand arborele Huffman construit

void HuffmanCodes(char data[], int frecv[], int size)
{
struct Node *st, *dr, *top;
priority_queue<Node*, vector<Node *>, compare> minHeap;
for (int i = 0; i < size; ++i)
minHeap.push(new Node(data[i], frecv[i]));
while (minHeap.size() != 1) {

st = minHeap.top();
minHeap.pop();
dr = minHeap.top();
minHeap.pop();
top = new Node('$', st ->frecv + dr ->frecv);
top->st = st;
top->dr = dr;
minHeap.push(top);
}
printCodes(minHeap.top(), "");
}

int main()
{
fstream f("huffman.in",ios::in);

char arr[50];
int frecv[50],i;
i=0;
while(f)
{ f>>arr[i]>>frecv[i];
i++;
}
int size = i -1;
HuffmanCodes(arr, frecv, size);
return 0;
}

38 8. Algoritmul lui Prim
Algoritmul lui Prim este un algoritm ce detremină arborele parțial de cost minim al unui graf
conex ponderat. Adică acest alg oritm determină submulțimea muchiilor ce formează un arbore
din toate vârfurile grafului pentru care ponderea drumurilor este minimă .
Algoritmul lui Prim se implementează utilizând tehnica Greedy . Graful este memorat pron matricea
costurilor. Pentru fiecar e pas alegem muchia de cost minim ce are un nod în arborele H1 deja creat și
celălalt nod liber . Pentru aceasta utilizăm tabloul unidimensional T (vector de tați) unde memorăm
pentru fiecare nod neales încă, nodul din H1 de care acesta se leagă printr -o mu chie de cost minim. În
coada de priorități (vector) Q reținem costul unei muchi i selectate . Prima dată în H1 avem nodul 1, iar
elementele vectorului T sunt 1, exceptând T[1], elementele cozii Q, au valorile din prima linie a
matricei costurilor c. La fieca re pas se adaugă un vârf nou la H1, și se actualizează elementele din T și
Q pentru nodurile nealese încă.
Algoritmul pseudocod corespunzător este:
algoritm Prim(G,c,r )
QX(G)
pentru fiecare u Q executa
D[u]∞
sfarsit pentru
D[r]0
T[r]0
cat timp Q0 executa
uExtrage_Minim(Q)
pentru fiecare v cinilor lui u executa
daca vQ și c(u,v) D[v] atunci
T[v]u
D[v]c(u,v)
sfarsit daca
sfarsit pentru
sfarsit cat timp

Coada de priorități Q se inițializează astfel încât acesta să conțin ă toate nodurile grafului, iar câmpul D
pentru fiecare nod ia valoarea ∞, fără nodul rădăcina r, pentru care D ia valoarea 0. T[r]= 0, pentru că r
nu are ‘tată’. În timpul executării algoritmului, mulțimea X-Q reține nodurile arborelui selectat . Se
găsește un nod uQ incident unei muchii de cost minim. Excluderea nodului u din coada Q îl mută în
mulțimea U-Q noduri lor din arbore. În continuare se modifică valorile din D și T pentru fiecare nod v
adiacent lui u, care nu aparține arbore lui. Modificare valoril or îndeplinește condiți a ca să fie de cost
minim.

39
Fie graful din figura următoare :

Configurația inițială:

Pasul 1:

Pasul 2:

40 Pasul 3:

Pasul 4:

Pasul 5:

41 Pasul 6:

Codul programului C++:
#include<iostream>
#include<fst ream>
#define N 30
#define M 60
#define INF 1<<14
using namespace std;
void citire_graf(int c[N][N],int &n)
{
int m,i,j,x,y,z;
fstream fin("graf.in",ios::in);
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) c[i][j]=INF;
for(i=1;i<=n;i++) c[i][i]=0;
for(i=1;i<=m;i++)
{
fin>>x>>y>>z;
c[x][y]=c[y][x]=z;
}
fin.close();
}
void apm(int c[N][N],int n)
{
int D[N],T[N],Q[N],i,j,min,w,ct=0;
for(i=1;i<=n;i++) D[i]=i;
D[1]=0;
for(j=2;j<=n;j++)
{
T[j]=1; Q[j]=c[1][j];
}
cout<<"APM: "<<e ndl;

42 while(1)
{
min=INF;
for(i=2;i<=n;i++)
if(D[i] && Q[i]<min)
{
min=Q[i]; w=i;
}
if(min==INF) break;
D[w]=0;
cout<<"["<<T[w]<<"]["<<w<<"]="; // adaugam muchia
ct+=c[T[w]][w]; //modificam costul cu noul cost obtinut dupa ad augarea muchiei
for(j=2;j<=n;j++)
if(D[j] && Q[j]>c[w][j])
{
T[j]=w; Q[j]=c[w][j];
}
}
cout<<"Costul minim este "<<ct<<endl;
}
int main()
{
int c[N][N],n;
citire_graf(c,n); apm(c,n);
return 0;
}

9. Algoritmul lui Kruskal
Fie un graf neor ientat conex, fiecare muchie a grafului are un cost pozitiv. Se cere să se
găsească submulțimea muchiilor care formează un arbore care include toate vârfurile și al cărui
cost este minim .
Algoritmul lui Kruskal folosește tehnica greedy, acesta construiește arborele parțial de cost
minim muchie cu muchie: se alege prima muchia de cost minim, apoi se adaugă repetat muchia de cost
minim nealeasă anterior și care nu formează cu precedentele un ciclu.
Pentru început pronim de la n arbori disjuncți, fiecare arbor e este reprezentat de un singur nod
al grafului : H1, H 2,…….,H n. La fiecare interație încercăm să reunim doi dintre arborii inițiali , pentru
stabilirea celor doi arbori ce vor fi reuniți se procedează astfel : selectăm muchia de cost minim ,ce nu a
fost alea să și care are extremitățile în cei doi arbori . Când adăugăm această muchie la arborele care se
construiește, cei doi arbori disjuncți se vor reuni într unul singur. Executând n-1 pași vom obține
arborele parțial de cost minim care are n-1 muchii.
Algorit mul pseudocod corespunzător este:
“algoritm Kruskal(G,U)
A
pentru fiecare varf v  X(G) executa

43 Formeaza_Multime(v)
sfarsit pentru
sorteaza muchiile din u in ordinea crescatoare a costului c
pentru fiecare muchie (u,v) U(G),in ordinea crescatoare a costului
executa
daca Gaseste_Multime(u) Gaseste_Multime(v) atunci
AA  {(u,v)}
Uneste(u,v)
sfarsit daca
sfarsit pentru
returneaza A ”
[https://informaticacnet.wordpress.com/category/clasa -a-xi-a/]

Implementarea algoritmului utilizează o structură de date pentru memorarea mai multor mulțimi
de elemente disjuncte. Subprogramul Gaseste_Multime(u) furmizează un element reprezentativ din
mulțimea care îl conține pe u. Pentru a determina dacă două vârfuri u și v aparțin aceluiași arbore
testăm dacă Gaseste_Multime(u) este egal cu Gaseste_Multime(v) . Unificarea celor doi arborilor este
implementată în subprogramul Uneste(u,v) .
Algoritmul lui Kruskal se implementează reprezentând graful prin vectorul muchiilor, fiecare
muchie având și un costul. Pen tru a s tabili la fiecare pas cărui arbore îi aparține nodul i, vom utiliza
vectorul L. La început avem n arbori disjuncți, asta însemnând că L[i]=i , pentru i{1,2,….n} . Pentru a
face o alegere optimă a muchiilor, vectorul de muchii se va ordona crescător după cost. Pentru alegerea
celor n-1 muchii ale arborelui parțial de cost minim vom parcurge elementele vectorului u astfel:
Alegem muchia v=[u[i].x,u[i].y] pentru a fi analizată (pornim de la i=1). Dacă extremitățile
muchiei au valori egale în vectorul L, atunci ele aparțin aceluiași arbore, iar selectarea muchiei va duce
la crearea unui ciclu. Altfel , extremitățile muchiei aparțin la doi arbori diferiți , fie aceștia Hx și Hy, ce
pot fi reuniți , această operație se realizează punând în vectorul L aceeași valoare (provenită din primul
sau din al doilea arbore). Algoritmul se prepetă până selectăm cele n-1 muchii ale arborelui parțial de
cost minim .
Exemplu : Se dă graful de mai jos :

Pașii algoritmului sunt:
Inițial arborele par țial de cost minim este format din noduri izolate ale grafului :
Ordonâ nd crescător după cost obținem : u=([5,4],[3,4],[3,5],[1,2],[2,5],[2,3],[6,5],[2,6],[2,7], [1,7],[7,6])

44
c=(1,1,2,2,2,3,3,3,3,4,5)
L=(1,2,3,4,5,6,7)

Pasul 1:

Alegem prima muchie [5,4](de cost
minim) și vectorul L devine:
(1,2,3,5,5,6,7) după reunirea arborilor H4
și H5 și obținând arborele H5=(4,5) .

Pasul 2:
Selectăm muchia [3,4] ,
următoarea muchie cu cost minim,
reunim H3 și H5 și obținem
L=(1,2,3,3,3,6,7) și H3=(3,4,5) .

Pasul 3:
Verifică muchia [3,5] pentru care L[3]=L[5] (
Alegem muchia [1,2] , și reunim H1 și H2 obțin ând:
L=(1,1,3,3,3,6,7) și H1=(1,2) .

45 Pasul 4:
Alegem muchia [2,5] , reunim H1 și H3 și obținem:
L=(1,1,1,1,1,6,7) și H1=(1,2,3,4,5) .

Pasul 5:

Muchia [2,3] aparține deja aceluiași arbore, alegem
muchia [6,5] obține m arborele H1=(1,2,3,4,5,6) .

Pasul 6:
Alegem muchia [2,7] și L=(2,2,2,2,2,2,2) ,
adică toate muchiile aparțin aceluiași arbore=APM
H=([1,2], [2,5], [3,4] , [5,4], [6,5],
[2,7]) ,iar costul total este 12.

Observație : Pentru un graf conex G cu mai multe muchii cu același cost există mai multe
posibilități de a alege o muchie de cost minim, asta înseamnă că pot exista mai mulți arbori parțiali de
cost minim . Arborii respectivi se deosebesc prin muchiile ce se vor selecta, și nu prin cost , deoarece
costul va fi același pentru toți arborii, respectiv cost minim.

46 Codul programului C++:
#include<iostream>
#include<fstream>
#define N 30
#define M 60
using namespace std;
typedef struct {
int x,y;
float cost;}mch;
void citire(mch u[M],int &n,int &m)
{
int k;
ifstream fin("graf.in");
fin>>n>>m;
for(k=1;k<=m;k++)
fin>>u[k].x>>u[k].y>>u[k].cost;
fin.close();}
void sortare(mch u[M],int m)
{
mch aux; int i,j;
for(i=1;i<=m -1;i++)
for(j=i+1;j<=m;j++)
if(u[i].cost>u[j].cost)
{
aux=u[i]; u[i]=u[j]; u[j]=aux;
}}
void apm(mch u[M],int n,int m)
{int L[N],k,i,v,w,j;
float ct=0;
for(i=1;i<=n;i++) L[i]=i; //se creeaza arbori disjun cti
i=1; k=0;
cout<<"APM: "<<endl;
while(k<n -1)
{
if(L[u[i].x]!=L[u[i].y]) //nodurile muchiei sunt in arbori diferiti
{
k++;
ct+=u[i].cost; //actualizam costul mchiei
cout<<"["<<u[i].x<<"]["<<u[i].y<<"] ";
v=L[u[i].y]; w=L[u[i].x];
for(j=1;j<=n;j++)
if(L[j]==v) L[j]=w; //unificam cei doi arbori
}
i++;
}
cout<<"costul minim este "<<ct<<endl;

47 }
int main()
{
mch u[M]; int n,m;
citire(u,n,m);
sortare(u,m);
apm(u,n,m);

}
10. Probleme propuse
a. Nivel clasă
1) Să se plătească o sumă s cu un număr minim de bancnote cu valori date. Se consideră că din
fiecare tip de bancnotă se poate folosi un număr nelimitat de bancnote , iar pentru ca
problema să aibă soluție vom considera că există și bancnote cu val oarea 1.
Obs. Mulțimea A este formată din cele n valori distincte ale bancnotelor . Pentru ca numărul de
bancnote să fie cât mai mic, trebuie ca plata să se facă în bancnote cu valori cât mai mari.
2) Expresie de valoare maximă. Pentru două mulțimi de numere î ntregi nenule, C cu n elemente
și A cu m elemente, (n<=m), se cere să se formeze o submulțime de n elemente din mulțimea
A, astfel încât expresia: E=c 1 *x1+c2 *x2+…+c n *xn să aibă valoarea maximă, (x i din A).
Obs. Criteriul de alegere a elementelor x i este următorul: dacă în mulțimea A există mai multe
elemente care au același semn cu coeficientul c i, se va alege elementul x j pentru care termenul c i*xj
are valoarea maximă, iar dacă în mulțimea A nu mai există elemente care au același semn cu
coeficientul c i, se va alege xj pentru care c i*xj are valoare minimă.
3) Un șofer pornește dintr -un oraș A și trebuie să ajungă în orașul B. Rezervorul autoturismului,
dacă este plin, îi permite să parcurgă n kilometri. Pe hartă sunt trecute m stații de alimentare
și distan țele dintre ele. Șoferul dorește să se oprească la cât mai puține stații pentru
alimentarea autoturismului. Realizați un program care să determine stațiile de benzină la
care trebuie să se oprească pentru alimentare.
4) Fiind dată o hartă cu n țări, se cere o soluție de colorare a hărții, utilizând cel mult patru
culori, astfel încât două țări ce au frontiera comună să fie colorate diferit. Este demonstrat
faptul că sunt suficiente numai patru culori pentru ca orice hartă să poată fi colorată.
5) De-a lungul prin cipalei străzi din orașul nostru există n plopi, pentru fiecare cunoscându -se
înălțimea. Primarul orașului dorește ca plopii să aibă înălțimile în ordine descrescătoare.
Pentru aceasta, este posibilă tăierea dintr -un plop a unei bucăți – este o tehnică eco logică,
nevătămătoare, în urma căreia plopul nu are de suferit. Plopii nu pot fi înălțați în nici un fel.
Determinați numărul minim de plopi din care se va tăia și lungimea totală minimă a bucăților
tăiate.

48
b. Nivel cerc
1) Gigel este un cântăreț începător. El știe deja să cânte n piese, și pentru fiecare piesă se
cunoaște durata, exprimată în minute și secunde. Gigel va participa la o emisiune de
televiziune, unde va putea cânta timp de T secunde. El vrea să cânte cât mai multe piese,
pentru a -și demonstra talentul deosebit. Ajutați -l să aleagă piesele pentru emisiune, și vă va
răsplăti cu un autograf.
2) În fișierul ZigZag.in se dau N numere întregi ( N≤1000 ). Scrie ți pe prima linie a fișierului
ZigZag.out cel mai lung MZigZag c e se poate forma din numerele cit ite.
A1, a2, …, a m este o MZigZag o secvență de numere dacă a1 ≤ a 2 ≥ a 3 ≤ a 4 ≥ a 5 ≤… a m-1≥a m.
3) Orașul A este situat pe un mal al Dunării , iar orașul B pe celalalt mal. Legătura dintre orașele
A si B se poate realiza numai cu bacul. Compania X a primit autorizație de transport fluvial, cu
condiția sa asigure si legătura cu bacul intre orașele A si B. Primăriile celor doua orașe au
stabilit de comun acord programul sosiri -plecări pe care trebuie sa îl respecte campania X.
Fiind un m are prog ramator dornic de afirmare, vreți să determinaț i numărul minim de bacuri
necesare companiei, astfel încât programul sa poată fi respectat.
4) Considerăm un depozit cu n (n≤1000) camere, care conț in respectiv cantitățile de marfă C1,
C2, …, C n, (numere naturale). Realizați un program care să determine un grup de camere cu
proprietatea că suma cantităților de marfă pe care le contin se poate împărți exact la cele n
camioane care o transportă.
5) Se consideră n intervale închise [a,b] , a,b numere întregi, n,a,b<100000 . Să se dete rmine
reuniunea acestora. Exemplu: pentru n=5 si intervalele :
2 4
1 3
5 8
10 12
6 9 se va afișa :
1 4
5 9
10 12
Indicație: se ordonează intervalele după extremitatea stângă. Printr -o parcurgere liniară a șirului
intervalelor, se actualizează pas cu pas capătul stâng ș i cel drept al intervalului reuniune .
c. Nivel olimpiade și concursuri
1) Într-un camping există k căsuțe care pot fi închiriate 365 de zile din an. Orice turist poate
închiria o căsuță pentru exact m zile consecutive din an. Campingul a adunat s olicitările a n
turiști pe un an întreg, cu un an înainte. Fiecare turist precizează prima zi cu care dorește
să închirieze o căsuță . Să se determine numărul maxim de turiști care vor putea fi primiți în
camping ( k≤100, m≤20, n≤1000 ).
2) Țăranul Victor plicti sit să asculte atâta rock și -a gă sit o noua pasiune: jazz -ul. Astfel, el s -a
tuns, s -a vopsit negru, iar apoi și -a procurat o trompetă. Pentru a -și demonstra calităț ile
muzicale, el s -a ho tărât să țină un concert live. Din păcate, alte activităț i i-au cons umat o
parte din timpul pentru exersat și acum nu mai este capabil să cânte î ntreg concertul. Mai
exact, din cele N note iniț iale, el mai poate cânta M, deoarece apoi obosește și începe să
falseze. Fiecare notă este reprezentată de o valoare din intervalul [0..9] care indică gradul

49 de plăcere pe care îl produce publicului dacă este cântată. Plăcerea totală a unui concert
este egală cu alipirea notelor cântate privite ca un număr în baza 10. Țăranul Victor s -a
gândit că ar fi bine să aleagă notele astfel înc ât concertul să fie câ t mai p e placul publicului,
pentru a părea că se descurcă mai bine decât î n realitate. Fiind date cele N note inițiale,
găsiți concertul visat de ță ran.
Pe prima linie a fiș ierului trompeta.in se gă sesc numerele N și M. Pe urmatoarea linie sunt
date valorile corespunzătoare celor N note.
Pe prima linie a fiș ierului trompeta.out se află M cifre, reprezentâ nd concertul care va fi
cântat.
Obs. Se formează treptat rezulta tul cu ajutorul unei stive: dacă cifra curentă este mai bună decât
cea din vârful stivei ș i numărul de cifre din stivă + numărul de cifre ră mase ≥ M , atunci
elementul din vâ rful stivei este eliminat.
3) Profesorul Onizuka are în clasa N elevi. Aceș tia sunt numerotați de la 1 la N. El a pri mit o
foaie cu N – 1 semne de tipul: < și >. El trebuie să așeze cei N elevi în bănci ( bănicile fiind
așezate în linie), astfel încât indicii elevilor să corespundă cu restricț iile semnel or
impuse(daca primul semn este >, atunci elevul din banca 1 trebuie sa aibă indicele mai
mare ca indicele copilului din banca 2).
Fișierul de intrare semne3.in va conț ine un număr natural N pe prima linie . Pe linia 2 vor
fi N – 1 semne de tipul < și >.
Fișierul de ieșire semne3.out va conține N numere reprezentând indicii elevilor puși î n
cele N bănci(al i-lea număr o să conț ină indicele elevului pus în banca i). Se cere soluția
minim lexicografică .
semne3.in semne3.out
4
><> 2 1 4 3

Obs. Avem de completat N poziț ii cu numere de la 1 la N. Pentru ca soluția să fie minimă din
punct de vedere lexicogra fic, tr ebuie ca pe fiecare poziț ie să punem un num ăr câ t mai mic care
să ne permită să completăm și restul poziț iilor.
Fie ș irul ">". Avem de completat două poziții. Am dori să punem pe prima poziție 1, însă
aceasta nu ne -ar p ermite sa punem o valoare validă pe a doua poziț ie.
Fie șirul " >>". Pe prima poziț ie vom pune un număr x după care vor urma încă două numere
care trebuie să fie obligatoriu mai mici ca x. Cel mai mic x valid este x=3.
De aici rezultă un algoritm greedy care procesează subsecvențele "<<…<<" și ">>…>>" de la
stânga la dreapta.
Pentru fiecare subsecvență avem două cazuri. Notăm lungimea subsecvenț ei cu K.
Cazul "<<…<<": Completam poziț iile cu cele mai mici K numere î n ordinea din lista.
Cazul ">>…>>": Fie cele mai mici K numere a1, a2, …, ak. Deoarece dup ă cele K poziț ii va
urma încă un număr care e mai mic decât restul, trebuie să lăsăm disponibil un număr. Deci
completăm pe aceste poziții, î n aceast ă ordine, ak, ak-1, …, a 2. Pe ultima poziț ie (după ultim ul
semn) punem singurul număr rămas disponibil.

50 4) Se dau N tipuri de numere. Consideră m un vecto r de elemente cu proprietatea că pentru
fiecare tip i numerotat de la 0 la N – 1 acesta apare de ( FR i) ori. Numerele de tipul i sunt
egale cu 2PWi. Să se partiționeze elementele vectorului î n 2 multiseturi astfel încât sumele
celor două să fie cât mai apropiate (diferența în modul să fie minimă ). Aflați aceasta
diferența minimă modulo 1.000.000.007 .
Fișierul de intrare greutati.in se vor afla pe prima linie 2 numere î ntregi N și P, unde N
reprezin tă numarul de puteri de 2 pentru care frecvența este diferită de 0, iar P reprezintă
puterea maximă la care poate apărea 2. Pe următoarele N linii se vor afla cate 2 numere
întregi PW i și FR i reprezentând o putere și o frecvență corespunzătoare acelei pute ri.
Fișierul de ieșire greutati.out va conține un singur număr natural reprezentând diferența
minimă pe care o puteți obține modulo 1.000.000.007 .

greutati.in greutati.out greutati.in greutati.out
6 10
4 4
3 3
5 2
8 4
6 1
7 3 8 7 10
4 4
3 3
5 2
8 4
6 1
7 3
0 3 5

Un algoritm greedy corect cu care am putea rezolva problema este să alegem cea mai mare
putere de 2 și să o punem î n setul care are suma mai mică.

51 B. Metoda programării dinamice
a) Descrierea metodei
Metoda programării dinamice, așa cum arată ș i numele, permite determinarea unei soluții pentru o
problemă dată în urma unui șir de decizii și prelucrări ce se condiționează reciproc, realizând o
dinamică continuă a procesului de că utare a soluției.
Această este recomandată în cazul problemelor care se cere stabilirea unui optim (minim sau
maxim), urmând un proces decizional (se aseamănă cu metoda greedy) care se d erulează în mai multe
stadii . Se începe de la o situație inițială și la fiecare etapă urmează luarea unei decizii care stabilește o
nouă situație , urmând a se ajunge la soluția finală, optimă. Tehnica aceasta împarte problema în
subprobleme din aceiași categorie , dar de dimensiuni mai mici (se aseamănă cu divide -et-impera).
Asemănător cu metoda ”divide et impera”, programarea dinamică rezolv ă problemele combinând
soluțiile unor subprobleme. Deosebirea constă în faptul că ”divide et impera” partiționează problema în
subprobleme independente, le rezolvă (de obicei recursiv) și apoi combină soluțiile lor pentru a rezolva
problema inițială, în ti mp ce programarea dinamică se aplică problemelor ale căror subprobleme nu
sunt independente, ele având ”sub -subprobleme” comune. În această situație, se rezolvă fiecare ”sub –
subproblemă” o singură dată, și se folosește un tablou pentru a memora soluția ei, evitându -se
recalcularea ei de câte ori subproblema reapare.
Metoda este aplicată atât în matematică la probleme de optimizare, cât și în informatică la utilizarea
optimă a resurselor disponibile. Această metodă a fost creată de matematicianul american Ri chard
Bellman în 1957.
Utilizarea acestei tehnici presupune experiență, intuiție și abilități matematice. Există doua variante
de abordare a acestei metode: prima de natură deductivă, iar cea de -a doua de natură inductivă.
Prima variantă descompune problem a recursiv în mai multe subprobleme, fiecare dintre acestea
returnând un optim parțial , iar optimul glo bal se va obține prin combinarea optimelor parț iale.
Deoarece subproblemele, la un anumit nivel, se vor suprapune necesitând rezolvarea aceleiași
subpro bleme, rezultatele se vor reține, în maniera “ bottom -up”, în anumite structuri de date.
A doua variantă face apel la concepte intuitive, iar p roblemele pentru care se poate utiliza metoda
programării dinamice au următoarele caracteristici:
– Soluția optimă s e alege dintr -o mulțime de soluții.
– Problema poate fi descompusă în subprobleme similare c u problema inițială ce respectă
principiul optimalității: soluția problemei este optimă dacă ea conține soluții optime ale
subproblemelor.
– Subproblemele în care ea se descompune nu sunt independente.
– Soluția problemei este dată de un vector s={x 1,x2,…,x m} și: există o mulțime finită A din care se
poate alege un element xi al soluției; fiecare etapă de determinare a unui element xi se bazează
pe rezultatele etapelor ant erioare; numărul de posibilități de a alege un element se reduce din
cauza cerințelor de optimizare și a restricțiilor impuse soluției.
Indiferent de varianta de abordare, rezolvarea problemelor prin metoda programării dinamice
presupune găsirea și rezolva rea unui sistem de recurențe. Deoarece recursivitatea presupune
complexitate ridicată se vor folosi structuri de date auxiliare pentru reținerea optimelor parțiale.
Folosirea acestor structuri de date (tabele) da numele tehnicii “programare dinamică”.

52 Dezv oltarea unui algoritm bazat pe programarea dinamică poate fi împărțită într -o secvență de
patru pași.
1. Caracterizarea structurii unei soluții optime.
2. Definirea recursivă a valorii unei soluții optime.
3. Calculul valorii unei soluții optime într -o manie ră de tip “bottom -up”.
4. Construirea unei soluții optime din informația calculată.
Primii trei pași sunt baza unei abordări de tip programare dinamică. Ultimul pas poate fi omis dacă
se dorește doar calculul unei singure soluții optime. În vederea realizăr ii pasului 4, deseori se păstrează
informație suplimentară de la execuția pasului 3, pentru a ușura construcția unei soluții optimale.

53 b) Probleme rezolvate prin metoda programării dinamice
1) Pachete
Vasile descarcă de pe Internet o aplicație foarte inte resantă. Aplicația a fost împărțită în
mai multe pachete, iar pachetele trebuie să fie descărcate într -o ordine fixată. Se cunoaște timpul
de descărcare pentru fiecare pachet, precum și timpul necesar instalării fiecărui pachet (ambii
timpi fiind exprimați în secunde).
Fiind nerăbdător, Vasile vrea să testeze aplicația cât mai repede și deci vrea să înceapă instalarea
chiar înainte de a se fi terminat desc ărcarea tuturor pachetelor.
Dar știe că o dat ă ce a început instalarea aplica ției, aceasta nu mai poate fi întrerupt ă (va da
eroare daca la momentul în care este necesar ă instalarea unui pachet, acesta nu este complet
desc ărcat).
Realiza ți un program care să calculeze numărul minim de secunde (din momentul în care a
început descărcarea) după care Vasile poa te începe instalarea aplicației.
Date de intrare
Pe prima linie a fișierului de intrare pachete.in se află un număr natural n, reprezentând numărul
de pachete. Dedesubt pe cele n linii se află informațiile despre pachete, în ordinea în care acestea
trebuie să fie descărcate. Pe linia k+1 se afla două numere naturale, I și D separate printr -un spațiu cu
semnificația "timpul de instalare a pachetului k este I, iar timpul de descărcare a pachetului k este D".
Date de ieșire
Fișierul de ieșire pachete.out va co nține o singură linie pe care va fi scris numărul minim de
secunde (din momentul în care a început descărcarea) după care Vasile poate începe instalarea
aplicației.
Restricții
1 <= n <= 100 000
1 <= I,D <= 1000
Exemple
pachete.in pachete.out pachete.in pachete.out pachete.in pachete.out
4
2 1
1 5
3 3
2 4 7 5
1 1
1 2
3 1
2 1
3 3 2 7
2 1
2 4
1 2
2 1
3 2
3 1
1 3 3
Identificarea Subproblemelor
Se cere timpul minim (exprimat în secunde) după care poate începe instalarea aplicației,timp calculat
din momentul începerii descărcării primului pachet.

54 O subproblemă a problemei date ar putea fi formulată astfel:”determinați timpul minim după care poate
începe instalarea aplicației, în ipoteza că aplicația este formată numai din pachetele I,I+1,…,n -1,
(0≤I<n ), timp calculat din momentul în ceperii descărcării pachetului I”.
Stabilirea structurilor de date
Pentru a reține soluția fiecărei subprobleme vom utiliza un vector denumit min, cu n componente:
min[i] = numărul minim de secunde după care poate începe instalarea aplicației, calculat din
momentul începerii descărcării pachetului I, 0≤I<n.
Determinarea relației de recurență
Evident min[n-1]=D[n-1] (numărul minim de secunde după care poate începe instalarea
pachetului n-1, ultimul pachet, este egal cu timpul necesar descărcării complete a pachetului n-1).
Numărul minim de secunde după care poate începe instalarea aplicației, calculat de la momentul
începerii instalării pachetului i, este ≥D[i] (timpul necesar pentru descărcarea completă a pachetului
i; nu putem începe instalarea aplicației decât dup ă descărcarea completă a cestui pachet). Atunci când
instalarea acestui pachet s -a terminat (operație care necesită Inst[i] secunde ), trebuie să
continuăm cu instalarea pachetelor i+1, i+2,…, n -1. Numărul minim de secunde d upă care
poate începe instalarea pachetelor i+1, i+2,…, n -1 este min[i+1] .
Dacă Inst[i]≥min[i+1] , atunci min[i]=D[i] (pentru că timpul necesar instalării pachetului
i a fost suficient de mare astfel încât să acopere timpul necesar pentru demararea instalăr ii celorlalte
pachete).
Dacă Inst[i]<min[i+1] ,atunci min[i]=D[i]+(min[i] -Inst[i]) (deci, trebuie să
adăugăm numărul de secunde care trebuie să se scurgă de la terminarea instalării pachetului i până când
poate să înceapă instalarea celorlalte pachete).
Putem formula deci relația de recurență :
 min[n-1]=D[n-1];
 min[i]=D[i]+max{0,min[i+1] -Inst[i]},oricare 0≤i≤n -1.
Evident, min[0] este soluția problemei date.
Codul programului C ++
#include<fstream>
using namespace std;
const int NMax=1000001;
#define max(x,y) ((x)>(y)?(x):(y));
int Inst[NMax], D[NMax], min2[NMax];
int main ()
{
fstream fin("pachete.in",ios::in);
fstream fout("pachete.out",ios::out);
int n, i;
fin>>n;
for(i=0;i<n;i++)

55 fin>>Inst[i]>>D[i];
min2[n -1]=D[n -1];
for(i=n -2;i>=0;i –)
min2[i]=D[i]+max(0,min2[i+1] -Inst[i]);
fout<<min2[0];
system("pause");
return 0;
}
Observații
1. Am prezentat aceas tă problemă ca primă aplicație l a metoda programării dinamice deoarece
este foarte simplă și adecvată pentru a ilustra modul de analiză a problemei. În acest caz simplu,
se putea rezolva relația de recurență și cu ajutorul unei funcții recursive, subproblemele nefiind
superpozabile.
2. Vectorul min nu era necesar. Observăm că pentru a calcula minimul este necesară numai
valoarea min[i+1] , deci putem utiliza pentru rezolvarea relației de recurență numai două
variabilei min_n ( în car e calculăm min[i] ) și min_v (în care memorăm min[i+1] ):
min_v=min_n=D[n -1];
for(i=n-2;i>=0;i –)
{min_n=D[i]+max(0, min_v -Inst[i]);
min_v=min_n;}
2) Tren
Trenul despre care discutăm este format dintr -o locomotivă și N vagoane (numerotate de
la 1 la N, încep ând de la locomotiv ă). În fiecare vagon se află un număr cunoscut de pasageri (să
notam cu vi numă rul de pasageri din vagonul i). Pasagerilor nu li se permite să se deplaseze de la
un vagon la altul.
Locomotiva s -a defectat și pentru a duce vagoanele l a destinație, pot fi utilizate 3
minilocomotive, aduse din stația de tren cea mai apropiată. O minilocomotivă poate trage un
număr mic de vagoane (maxim M), iar în general cele 3 minilocomotive nu sunt suficiente pentru
a trage toate vagoanele din care est e format trenul.
Realizați un program care să calculeze numărul maxim de pasageri ce pot fi transportați la
destinație cu cele 3 minilocomotive.
O minilocomotivă poate trage o secvență de vagoane (vagoane consecutive ale trenu lui).
Secvenț a de vagoane tras ă de minilocomotivă 1 nu trebuie s ă înceap ă neapărat cu primul vagon
(minilocomotivă 1 poate trage mai întâi pe o linie moartă vagoanele de la î nceputul trenulu i pe care nu
le duce la destinație și apoi să preia secvenț a de maxim M vagoane pe care s ă o duc ă la destina ție).
Secven ța de vagoane tras ă de minilocomotivă 1 nu trebuie s ă fie adiacent ă cu secven ța de vagoane tras ă
de minilocomotivă 2. Minilocomotivă 2 poate trage pe o linie moart ă vagoanele situate între ultimul
vagon tras de locomotiva 1 și primu l vagon pe care locomotiva 2 inten ționeaz ă să-l ducă la destina ție.
În mod analog, secven ța de vagoane tras ă de minilocomotivă 2 nu trebuie s ă fie adiacent ă cu secven ța
de vagoane tras ă de minilocomotivă 3.
De exemplu, s ă presupunem c ă trenul are N=7 vagoa ne, iar o minilocomotiv ă poate trage
maxim M=2 vagoane. S ă consider ăm că numărul de pasageri din fiecare vagon este:

56 Vagon 1 2 3 4 5 6 7
Număr de pasageri 35 40 50 10 30 45 60
Dacă minilocomotivă 1 duce la destina ție vagoanele 1-2, minilocomotivă 2 duce vagoanele 3-4, iar
minilocomotivă 3 duce vagoanele 6-7, num ărul de pasageri care ajung la destina ție este 240 și acesta
este maximul posibil.
Date de intrare
Fișierul de intrare tren.in conține un num ăr natural N pe prima linie reprezent ând num ărul de
vago ane. Cea de a doua linie con ține N numere naturale separate prin c âte un spa țiu v1, v2 … v N,
reprezent ând num ărul de pasageri din fiecare vagon. Cea de a treia linie con ține un num ăr natural M
care reprezint ă numărul maxim de vagoane care pot fi trase de o minilocomotiv ă.
Date de ieșire
Fișierul de ieșire tren.out conține o singur ă linie pe care se afl ă numărul maxim de pasageri ce pot
fi transporta ți cu 3 minilocomotive.
Restricții
 1 ≤ M ≤ N ≤ 50000
 vi ≤ 100, pentru orice 1 ≤ i ≤ N
Exemplu
tren.in tren.o ut
7
35 40 50 10 30 45 60
2 240
Soluție
Vom rezolva această problemă mai generală, vom determina numărul maxim de pasageri ce pot fi
transportați la destinație cu k locomotive ( în cazul nostru particular, k=3).
Identificarea subproblemelor
O subproblem ă a problemei date se poate formula astfel: să se determine numărul maxim de pasageri
ce pot fi transportați din vagoanele 1,2,3, …, i folosind j minilocomotive.
Stabilirea structurilor de date
Observăm că în formularea unei subprobleme intervin două vari abile: numărul de vagoane și numărul
de minilocomotive.
Prin urmare pentru a memora soluțiile subproblemelor se va folosi un tablou bidimensional s cu
n linii și k coloane: s[i][j] reprezintă numărul maxim de pasageri ce pot fi transportați din
vagoanele 1, 2, …, i folosind j minilocomotive .

57 Evident soluția problemei inițiale va fi calculată în s[n][3] .
Determinarea relației de recurență
Un număr maxim de pasageri transportați se poate obține transportând cu j locomotive un număr
maxim de pasageri din pri mele i+1 vagoane ( s[i-1][j] ) sau transportâ nd cu j-1 locomotive un
număr maxim de pasageri din primele i-M vagoane ( s[i-M][j-1] ), la care se adaugă pasageri
aflați în vagoanele i-M+1, i-M+2, …, I (cu i-M>0), care vor fi transportați cu locomotiv a j.
Să notăm cu sum[i] numărul total de pasageri din primele i vagoane ,
.
Se obține astfel relația de recurență:
 s[0][j]=0, j=1, k;
 s[i][j]=sum[i] , dacă i≤M; j=1,k;
 s[i][j]=max{s[i -1][j], s[i -M][j-1]+(sum[i] -sum[i-M])} , dacă i>M.
Codul programului C++
#include <fstream>
using namespace std;
const int Dim=50000;
const int k=3;
int s[Dim+1][4], v[Dim+1], sum[Dim+1], M, n;
int main ()
{
fstream fin("tren.in",ios::in);
fstream fout("tren.out",ios::out);
int i,j;
fin>>n;
for(i=1;i<=n;i++)
{fin>>v[i];
sum[i]=su m[i-1]+v[i];}
fin>>M;
for(i=1;i<=M;i++)
for(j=1;j<=k;j++) s[i][j]=sum[i];
for(i=M+1;i<=n;i++)
for(j=1;j<=k;j++)
{s[i][j]=s[i -1][j];
if(s[i][j]<s[i -M][j -1]+(sum[i] -sum[i -M]))
s[i][j]=s[i -M][j -1]+(sum[i] -sum[i -M]);
}
fout<<s[n][k];
system("pause");
return 0;
}

58 3) Subșir crescător maximal
Fie șirul A=(a 1, a2,…a n). Numim subșir al șirului A o înșiruire de elemente din A, în ordinea în care
ele apar în șirul A, nu neapărat pe poziții consecutive. Pentru un șir dat, determinați un subșir
crescător de l ungime maximă.
Exemplu: A=(8,3,6,50,20,8,100,30,60,40,80) o soluție poate fi: (3,6,20,30,60,80)
Implementarea metodei programării dinamice
Pentru a determina șirul de lungime maximă, trebuie calculată, pentru fiecare element ai al șirului,
lungimea celui m ai mare subșir crescător care se poate forma începând cu el, după care se alege
subșirul cu lungime maximă.
Pas1. Problema are substructură optimă. În subproblema i se determină subșir crescător cel mai lung
al șirului, care începe cu numărul ai astfel: se adaugă la numărul ai subșirul cu lungime maximă dintre
subșirurile din subproblemele anterioare care încep cu numărul aj, cu ai≤ aj și i<j
Pas2. Structura de date pentru memorarea soluțiilor parțiale:
– Construim vectorul L(n) ,
L[i] =lungimea subșir ului crescător cel mai lung, care începe la poziția i
– Construim vectorul urm(n)
urm[i] =indicele elementului care urmează lui ai în subșirul crescător maximal, dacă există
următor sau 0, dacă nu există alt element după ai. (vectorul urm este necesar pentru reconstit uirea
subșirului).
Soluția finală a problemei va fi maximul din vectorul Lmax , iar subșirul căutat va începe la pozmax ,
poziția la care apare acest maxim.
Pas3. Relația de recurență:
Lmax[n]=1, urm[n]=0;
Lmax[i]=max{Lmax[j]+1 , dacă a [i]<=a[j] , i≠n și i<j≤n },
urm[i] =indicele elementului următor din subșirul de lungime maximă care începe cu ai.
Se folosesc următoarele date și structuri de date:
– n – pentru numărul de elemente ale șirului
– vectorul a – pentru memorarea șirului
– vectorul L – pentru memorarea lungi milor maxime
– vectorul urm – pentru memorarea indicelui elementului următor din subșir
Se folosesc următoarele subprograme:
– citeste() – pentru citirea datelor din fișier.
– init() – inițializează elementul n din vectorul n cu 1 și elementul n din vectorul urm cu n
– p_dinamic() – calculează lungimea maximă a subșirurilor care încep cu fiecare element ai
din șir
– cauta_sol() – caută cea mai mare lungime a unui subșir
– afiseaza() – afișează lungimea șirului găsit și soluția problemei folosind informațiile din
vector ul urm.
Strategia programării dinamice este implementată astfel:

59 Pas1. L[n]=1 și urm[n]=n .
Pas2. Pentru i de la n-1 pana la 1
Pas3. Se inițializează lungimea maximă a subșirului care începe cu acest element cu valoarea 1 și
poziția cu care începe subșirul cu poziția elementului în șir.
Pas4. Se calculează lungimea maximă a subșirului astfel: pentru toate elementele j care urmează după
elementul i execută:
Pas5. Daca ai<aj și lungimea subșirului care începe cu aj este mai mare decât lungimea subșirului
care începe cu ai, atunci L[i]=1+L[j] și urm[i]=j ;
Pas6. Se determină cea mai mare valoare din vectorul L.
Sir.in
6
1 -2 3 2 4 4
Indicii 1 2 3 4 5 6
a 1 -2 3 2 4 4
L 4 4 3 3 2 1
urm 3 3 5 5 6 6
Subșirul 1 3 4 6
Codul programului C++:
#include <fstream>
#include <iostream>
using namespace std;
fstream fin("sir.in",ios::in);
int n, a[50], L[50],urm[50],pmax;
void citeste()
{ int i; fin>>n;
for(i=1;i<=n;i++) fin>>a[i]; fin.close();
}
void init()
{L[n]=1;urm[n]=n;}

void p_dinamic()
{ int i,j;
for(i=n -1;i>=1;i –)
{
L[i]=1;urm[i]=i;
for(j=i+1;j<=n;j++)
if(a[i]<=a[j] && L[i]<=L[j]) { L[i]=L[j]+1;
urm[i]=j;}}}
void cauta_sol()
{int i, max= -1;
for(i=1;i<=n;i++)
if(max<L[i]){max=L[i];pmax=i;}}

60 void afiseaza()
{ int i,j;
cout<<"Lun gimea subsirului este: "<<L[pmax]<<endl;
for(i=1,j=pmax;i<=L[pmax];i++,j=urm[j]) cout<<a[j]<<" ";}
int main()
{citeste();p_dinamic();cauta_sol();afiseaza();}
4) Pietre
Un copil singur la părinți a descoperit un joc nou. Prin curtea casei sale trece un râu, nu foarte
adânc și nici foarte învolburat . Pentru traversarea râului sunt puse în albie n pietre. Copilul a
scris pe fiecare piatră un număr natural și acum vrea să determine o modalitate de a traversa râul
astfel încât să facă un număr maxim de pași, res pectând următoarele reguli:
1. la fiecare pas, piatra pe care calcă să aibă un număr cel puțin egal cu piatra precedent(
malul de la care pleacă este considerat piatra cu numărul 0 );
2. copilul merge numai înainte
Determinați un traseu de lungime maximă care să respecte regulile de mai sus, în ipoteza că acest
copil este un bun atlet și la orice pas poate sări peste oricâte pietre.
Date de intrare
Fișierul pietre.in conține un număr natural n pe prima linie care reprezintă numărul de pietre. Pe
cea de -a doua lin ie de află n numere naturale nenule, separate prin câte un spațiu, care reprezintă, în
ordine, numerele scrise pe pietre.
Date de ieșire
Fișierul de ieșire pietre.out va conține pe prima linie numărul maxim de pi etre pe care pășește
copilul. Pe cea de -a doua linie vor fi scrise numerele de pe pietrele pe care a pășit, separate prin câte un
spațiu.
Restricție
0≤n≤1000
Exemplu
pietre.in pietre.out
11
8 3 6 50 10 8 100 30 60 40 80 6
3 6 10 30 60 80
Observație
Soluția nu este unică. De exemplu, și 3 6 8 30 40 80 este o soluție corectă.

61 Identificarea subproblemelor
Vom număra numerele scrise pe cele n pietre în vectorul a. Problema cere determinarea subșir ului
crescător cel mai lung al șirului a. O subproblemă a constă în a găsi subșir ul crescător cel mai lu ng ce
începe cu ai,
. Deci pentru a găsi subșir crescător cel mai lung ce începe cu ai trebuie
să aflăm subșiruri crescătoare cele mai lungi care încep cu aj, ai≤aj,
, ceea ce
înseamă că s ubproblemele nu sunt independent e.
Stabilirea structuri lor de date
Pentru a memora soluțiile subproblemelor vom utiliza doi vectori suplimentari, l și poz, fiecare cu
câte n componente, astfel :
 l[i] =lungime subșir ului cel mai lung ( crescător ), ce pornește de la a[i];
 poz[i ]=poziția elementului următor după a[i], în subșir ul cel mai lung (crescător ) ce începe
cu elementul a[i], dacă există, altfel va lua valoarea -1.
Determinarea relației de recurență
Relația de recurență ce definește substructura optim ă a problemei este:
 l[n]=1;poz[n]= -1;
 l[i]=max{1+l[j] │a[i]≤ a[j]};
j=i+1, n
 poz[i] =j,indicele pentru care se obține l[i] maxim .
Codul programului C++
#include<fstream>
using namespace std;
const int Dim=1000;
//const int k=3;
int a[Dim+1], poz[Dim+1], l[Dim+1], n;
int main ()
{ fstream fin("pietre.in",ios::in);
fstream fout("pietre.out",ios::out);
int i,j,max,pozmax;
fin>>n;
for(i=1;i<=n;i++)
fin>>a[i];
l[n]=1; poz[n]= -1;
for(i=n -1;i>0;i –)
for(l[i]=1, poz[i]= -1, j=i+1; j<=n;j++)
if(a[i]<=a[j] && l[i]<1+l[j]){l[i]=1+l[j];poz[i]=j;}//determinam maximul din vec torul l
max=l[1];pozmax=1;
for(i=2;i<=n;i++)if(max<l[i]){max=l[i];pozmax=i;}
fout<<"Lungimea subsir ului crescator cel mai lung : "<<max<<endl;
fout<<"Cel mai lung subsir :";
for(i=pozmax;i!= -1;i=poz[i]) fout<<a[i]<<" ";
system("pause") ;return 0;}

62 5) Problem a discretă a rucsacului
Un hoț deține un rucsac cu ajutorul căruia poate căra o greutate maximă Gmax . El poate
încărca rucsacul cu obiecte date , pentru fiecare obiect se dă greutatea gi și câștigul ci obținut
după selectarea obiectului i. Obiectele nu pot fi fragmentate, ele se pot introduce în rucsac, doar
în întregime .
Se cere să se găsească modalitate optimală de umplere a rucsacului astfel încât câștigul
obținut după umplerea acestuia să fie maxim . În situația în care nu avem soluții vom afișa
mesajul IMPOSIBIL .
Date de intrare
Din fișierul de intrare rucsac.in se citesc două numere naturale n și Gmax din prima linie
separate printr -un spațiu. Pe cea de -a doua linie se află n numere naturale separate prin spații, care
reprezintă greutățile celor n obiecte. Iar cea de -a treia linie se află n numere naturale separate prin
spații, reprezentând câștigurile corespunzătoare ce se pot obține alegând câte un obiect.
Date de ieșire
În fișierul de ieșire rucsac.out pe prima line se va afișa un număr natural ce reprezintă câștigul
maxim sau mesajul IMPOSIBIL . Pe următoarea linie, dacă avem solție vom afișa obiectele
selectate separate prin câte un spațiu.
Restricți i
 1<=n<=100;
 1<=Gmax<=300;
 gi, ci<=100,
.
Exemplu
rucsac.in rucsac.out Explicație
7 100
80 10 20 1 0 100 30 55
8 20 5 1 10 30 20 29
1 2 4 g[1]+g[2]+g[4]=80+10+10
Observație
Exist ă și alte variante de selectare, dar câștigul a r fi mai mic.
Identificarea subproblemelor
Problema constă în selectarea obiectelor, astfel încât suma greutăților să fie ega lă cu Gmax , iar câștigul
sa fie maxim.
O subproblemă presupune selectarea unor obiecte cu câștig maxim care permit încărcarea unui rucsac
de capacitate S, S≤Gmax (suma greutăților obiectelor selectate este S).
Stabilirea structurilor de date
Construim vect orul Cmax, cu Gmax+1 componente , având semnificația

63 Cmax[S]=memorează c âștigul maxim obținut în urma selectării obiecte lor cu suma greutăților S,
0≤S≤Gmax .
Deoarece este necesa ră și determinarea soluției optime, nu doar a câștigului maxim, vom reține pentr u
fiecare greutate posibilă S mulțimea obiectelor selectate pentru obținerea câștigului maxim. Constru im
matricea caracteristică uz cu Gmax+1 linii și n coloane, astfel:
uz[S][i]=1 , obiectul i a fost deja selectat pentru umplerea rucsacului și
uz[S][i]=0 , are semnificația de obiect neselectat .
Determinarea relației de recurență
Pentru umplerea rucsacului de capacitate S selectăm un obiect oarecare i, cu condiția să încapă în
rucsac, adică g[i]≤S, iar câștigul obținut este c[i]. În rucsac mai avem la dispozi ție S-g[i],
din capacitate ce tre buie încărcată optim ,pentru a obțin e câștigul maxim Cmax[S-g[i]], dacă este
posibil. De fiecare dată va trebui să verificăm dacă obiectul i nu a mai fost utilizat pentru umplerea
rucsacului, adică uz[s-g[i]][i]=0 .
Vom încer ca toate obiectele i posibile și vom alege acea valoare a lui i pentru care câștigul este
maxim.
 Cmax[0]=0 ;
 Cmax[S]=max{Cmax[S -g[i]]+c[i], dacă g[i]≤S și uz[S-g[i]][i]=0}
i=1,n
Codul programului C++
#include<fstream>
using namespace std;
const int Nmax=101 ;
const int MaxG=301;
int c[Nmax], g[Nmax], Uz[MaxG][Nmax],CMax[MaxG], GMax, n;
void Citire()
{ fstream fin("rucsac.in",ios::in);
int i,j;
fin>>n>>GMax;
for(i=1;i<=n;i++) fin>>g[i];
for(i=1;i<=n;i++) fin>>c[i];
fin.close();}
void Rezolvare()
{ int S,k,i;
for(S=1;S<=GMax;S++) CMax[S]= -1;
for(S=1;S<=GMax;S++)
for(i=1;i<=n;i++)
if(g[i]<=S && CMax[S -g[i]]!= -1 && !Uz[S -g[i]][i])
if(CMax[S]<c[i]+CMax[S -g[i]])
{CMax[S]=c[i]+CMax[S -g[i]];
for(k=1;k<=n;k++)
Uz[S][k]=Uz[S -g[i]][k];

64 Uz[S][i]=1;}}
void Afisare()
{ fstream fout("rucsac.out",ios::out);
if(CMax[GMax]== -1) fout<<"Imposibil";
else{ fout<<CMax[GMax]<<endl;
for(int k=1;k<=n;k++)
if(Uz[GMax][k]) fout<<k<<" ";}
fout.close();}
int main ()
{ Citire();
Rezolvare();
Afisare();
system("pause");
return 0;}
6) Subșir comun maximal
Fie v un vector cu N elemente. Se numeș te subșir de lungime K al vectorului v un nou
vector v' = (v i1, vi2, … v iK), cu i1 < i2 < … < i K. De exemplu, vectorul v = (5 7 8 9 1 6) conține ca
subșir șirurile (5 8 6) sau (7 8 1), dar nu conține subșirul (1 5). Se dau doi vectori A și B cu
elemente numere naturale nenule.
Să se determine subșirul de lungime maximă care apare atât în A cât și î n B.
Date de intrare
În fișierul cmlsc.in avem pe prima linie M și N, numarul de elemente pentru vectorul A, respectiv
pentru B. A doua linie conț ine M numere naturale, elementele vectorului A. A treia linie conț ine
descrierea vectorului B sub același format.
Date de ieș ire
Fișierul de ieș ire cmlsc.out va conț ine pe prima linie MAX, lungimea maximă a unui subșir comun.
A doua linie va conț ine MAX numere ce reprezintă un subșir comun pentru A și B. Dacă există mai
multe soluții se poate afiș a oricare.
Restricț ii
 1 ≤ M, N ≤ 1024
 Numerele din cei doi vectori nu depășesc 256
Exemplu
cmlsc.in cmlsc.out
5 3
1 7 3 9 8
7 5 8 2
7 8
Identificarea subproblemelor

65 Fie șirurile A = {x 1, x2, …, x m} și B ={y 1,y2,…,y n} și fie Z ={z 1,z2,…,z k} un
CMLSC pentru A și B.
1. Dacă xm = yn, atunci zk = xm = yn și Zk−1 este un CMLSC pentru Xm−1 și Yn−1.
2. Dacă xm ≠ yn, atunci, din zk ≠ xm rezultă că Z este un CMLSC pentru Xm−1 și B.
3. Dacă xm ≠ yn, atunci, din zk ≠ yn rezultă că Z este un CMLSC pentru A și Yn−1.

Aceasta arată că un CMLSC al două șiruri conține un CMLSC pentru prefixele celor două șiruri. Atunci,
problema CMLSC are proprietatea de substructură optimală. O soluție recursivă are, de asemenea,
proprietatea de suprapunere a problemelor, după cum vom arăta în cele ce urmează.
Relația de mai sus implică faptul că există fie una, fie două probleme care trebuie examinate pentru
găsirea unui CMLSC pentru A = {x 1, x2, …, x m} și B ={y 1,y2,…,y n}. Dacă xm = yn,
trebuie găsit un CMLSC pentru Xm−1 și Yn−1. Adăugarea elementului xm = yn la acest CMLSC produce
un CMLSC pentru A și B. Dacă xm ≠ yn, atunci trebuie rezo lvate două subprobleme: găsirea unui
CMLSC pentru Xm−1 și B și găsirea unui CMLSC pentru A și Yn−1. Cel mai lung CMLSC dintre acestea
două va fi CMLSC pentru A și B. Se poate observa că problema CMLSC se descompune în subprobleme
suprapuse. Pentru a găsi un CMLSC al șirurilor A și B, va trebui, probabil, calculat CMLSC pentru A și
Yn−1, respectiv, pentru Xm−1 și B. Dar fiecare dintre aceste subprobleme conține sub -subproblema găsirii
CMLSC pentru Xm−1 și Yn−1.
Determinarea relației de recurență
Soluția recurs ivă pentru problema CMLSC implică stabilirea unei recurențe pentru costul unei soluții
optime. Să definim c[i,j] ca lungimea unui CMLSC al șirurilor Xi și Yj. Dacă i = 0 sau j = 0 ,
CMLSC are lungimea 0. Substructura optimală a problemei CMLSC produce formul a recursivă :

Stabilirea structurilor de date
Construim vectorul A, cu M componente și vectorul B, cu N, în care vom reține elementele
celor două șiruri.
Problema constă în determinarea unei matrici D, cu M linii ‘și N coloane . Linia și coloa na 0 sunt
inițializate cu 0, iar elementul D[i,j] va fi lungimea celui mai lung subșir comun al șirurilor Xi și Yj.

66
Codul programului C++
#include<fstream>
#include <iostream>
using namespace std;
int a[100],b[100],n,m;
int d[100][100];
fstream g("cmlsc. out",ios::out);
void rezolva(){
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
if(a[i]==b[j]) d[i][j]=1+d[i -1][j-1];
else
if (d[i -1][j]>d[i][j -1]) d[i][j]=d[i -1][j];
else d[i][j]=d[i][j -1];
}
void afiseaza_solutie_max(int i,int j){

if(d[i][j])
if(a[i]==b[j])
{afiseaza_solutie_max(i -1,j-1);
g<<a[i]<<" ";}
else
{if (d[i][j]==d[i -1][j])
afiseaza_solutie_max(i -1,j);
else if (d[i][j]==d[i][j -1])
afiseaza_solutie_max(i,j -1);
}
}
int main(){
fstream f("cmlsc.in",ios::in);
f>>m>>n;
for(int i=1;i<=m;i++) f>>a[i];
for(int i=1;i<=n;i++) f>>b[i];
rezolva();
afiseaza_solutie_max(m,n);
}

67 7). Sumă în triunghi
Se dă un triunghi format din n linii (1<n
100), pe fiecare linie avem numere întregi din
din intrevalul [1,99]. De exemplu :
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Problema constă în scrierea unui program care să determine cea mai mare sumă de numere
aflate pe un drum între numărul de pe prima linie și un număr de pe ultima linie. Fiecare număr
din acest drum este situat sub precedentul, la stânga sau la dreapta aces tuia.
Identificarea subproblemelor
Vom reține triunghiul într -o matrice pătratică T, de ordin n, sub diagonala principală.
Subproblemele determină suma maximă care obținută din numere găsite pe un drum de la numărul
T[i][j] , până la un număr de pe ultima l inie, condiția este ca următorul număr din acest drum să fie
poziționat sub precedentul, la stânga sau la dreapta sa. Se observă că pentru a determina suma maximă
a numerelor de la T[i][j] până la ultima linie, vom calcula suma maximă a numerelor de la
T[i+1][j] la ultima linie și suma maximă a numerelor de la T[i+1][j+1] la ultima linie , deci
subproblemele nu sunt independente .
Determinarea relației de recurență
Pentru memorarea valorilor , vom folosi un tablou pătratic bidimensional S, de ordin n, care
reține în S[i][j]= suma maximă obținută pe un drum de la T[i][j] la un element de pe ultima linie,
îndeplinind condițiile date. S oluția problemei va fi reținută în elementul S[1][1].
Relația de recurență este:
S[n][i]=T[n][i], i
{1,2,…,n}
S[i][j]=T[i][j]+max{S[i+1][j], S[i+1][j+1]}
Stabilirea structurilor de date
n pentru numărul de linii ale triunghiului.
Matricea T pentru memorarea triunghiului.
Matricea S pentru memorarea sumelor maxime. Matrici pătratice cu dimensiunea n.
Strategia program ării dinamice este implementată astfel:
Pas1 . Se inițializează linia n a matricei sumelor maxime S cu elementele de pe linia n a matricei
triunghiului T.

68 Pas2 . Pentru următoarele linii ale matricei sumelor maxime începând cu linia n-1 până la linia 1,
execută:
Pas3 . Se calculează suma maximă astfel: dacă suma maximă S(i+1,j) – de sub elementul
curent – este mai mare decât suma maximă S(i+1,j+1) – de pe diagonala elementului curent,
atunci la elementul curent se adună suma S(i+1,j) ; altfel la elementul cure nt se adună suma
S(i+1,j+1).
Valoarea maximă a sumei este elementul S(1,1) .
Codul programului C++
#include<fstream>
#include<iostream>
using namespace std;
int n,m,T[101][101],S[101][101];
fstream fin("triunghi.in",ios::in),
fout("triunghi.out",ios::out);
void citire()
{
int i,j;
fin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
{
fin>>T[i][j];
}
}
void triunghi()
{
int i,j;
for (i=1; i<=n; i++)
S[n][i]=T[n][i];
for (i=n -1; i>0; i –)
for (j=1; j<=i; j++)
{
S[i][j]=T[i][j]+S[i+1][j];
if (S[i+1][j]<S [i+1][j+1])
S[i][j]=T[i][j]+S[i+1][j+1];
}
}
void tipar()
{
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
fout<<S[i][j]<<" ";

69 fout<<endl;
}
}
int main ()
{
citire();
triunghi();
tipar();
fin.close();
fout.close();
return 0;
}
8). Evaluare optimală
Să considerăm A={a1,a2,…, a n} o mulțime cu n elemente peste care este definită o operație
binară notată °: A×A→A .Pentru simplificare, vom considera, fără a restrânge generalitatea, că
A={1,2,…,n} .
Operația ° este specificată print r-o matrice op, cu n linii și n coloane ( op[i][j]=i°j ).Operația
° este necomutativă.
Efectuarea oricărei operații are un cost. Costurile sunt reținute într -o matrice c, c[i][j]
reprezentând costul efectuării operației i°j,
1
i, j
n.
Dându -se p valori cuprinse între 1 și n, x1, x 2,…, x p, să se determine costul minim pentru
evaluarea expresiei x1° x2°…° xp.
Date de intrare
În fișierul eval.in avem pe prima linie numerele naturale n și p, separate printr -un spațiu. Pe cea de
a doua linie se află p numere cuprinse între 1 și n, reprezentând valorile
°
°…°
.
Pe n linii se află câte n numere naturale cuprinse între 1 și n, reprezentând matricea op.
Pe ultimele n linii se află câte n numere naturale separate prin spații, reprezentând matricea costurilor
c.
Date de ieșire
Fișierul de ieșire eval.out va conține pe prima linie un număr natural reprezentând costul evaluării
expresiei
°
°…°
(minim posibil ).Pe cea de a doua linie vom descrie modalitatea optimă de
evaluare a expresiei
°
°…°
, indicând prin paranteze rotunde ordinea efectuării operațiilor.

70 Exemplu
eval.in eval.out Explica ție
4 3
2 3 4
1 1 4 2
3 2 1 4
1 4 1 2
2 1 3 2
1 1 1 1
1 1 10 1
10 20 5 5
20 5 5 5 6
2°(3°4) Expresia 2°3°4 se poate evalua în două moduri:
(2°3)°4=1°4=2
Cost=c[2][3]+c[1][4]=10+1=11
2°(3°4)=2°2=2
Cost=c[3][4]+c[2][2]=5+1=6
Varianta optimă este cea de a doua.
Identificarea subproblemelo r
Pentru a evalua
°
°…°
, în final va trebui să efectuăm operația ° între două valori, deci
vom paranteza expresia astfel:
(
°
°…°
)°(
°…°
), unde k este o poziție ce poate varia între 1 și p-1.
Această observație se aplică și expresiilor dintre paranteze. Prin urmare, subproblemele acestei
probleme trebuie să determine parantezarea optimă a expresiilor de forma
°
°…°
, 1
i
j
p.
Observăm că subproblemele nu sunt independente. De exemplu, evaluarea expresiei
°
°…°
și
evaluarea expresiei
°
°…°
, au ca subpro blemă comună evaluarea expresiei
°…°
.
Stabilirea structurilor de date
Formularea unei subprobleme depinde de două variabile ( i și j, ce reprezintă extremitățile secvenței
care se evaluează).Prin urmare, pentru a stoca soluțiile subproblemelor, folosim o matrice M, cu p linii
și p coloane, unde M[i][j] reprezintă costul minim pentru evaluarea expresiei
°
°…°
,
1
i
j
p.
De aici reiese că numărul minim de înm ulțiri pentru a calcula
°
°…°
este M[1][p].
Determinarea relației de recurență
Pentru ca evaluarea expresiei
°
°…°
să fie optimală expresiilor (
°
°…°
) și
(
°…°
) trebuie să fie, de asemenea, optimale. Demonstrația se poate face ușor, prin reducere la
absurd.
Deducem astfel relația de recurență:
 M[i][i]=0,
i
{1,2,…,p};
 M[i][j]=min{M[i][k] +M[k+1][j]+c[s][d]} , i≤k≤j
unde s am notat (
°
°…°
), iar cu d am notat (
°…°
).

71 Pentru a obține costul minim pentru evaluarea expresiei
°
°…°
, stabilim poziția de parantezare
k în toate tipurile posibile (între i și j-1) și selectăm poziția care determină aflarea minim ului. Pentru
o poziție stabilită , k, costul este egal cu costul minim pentru evaluarea expresiei (
°
°…°
), la care
se adaugă costul minim pentru evaluarea expresiei (
°…°
) și costul înmulțirii celor două valori
obținute ca rezultat al evaluării parantezei din stânga și al parantezei din dreapta.
Observăm că pentru a rezolva re lația de recurență trebuie să reținem pentru fiecare secvență și
rezultatul obținut în urma evaluării. Pentru aceasta vom utiliza o matrice denumită rez,
rez[i][j] =
°
°…°
în urma evaluării optimale.
Se observă că doar deasupra diagonalei principale din M avem valori . Pentru a obținerea soluției
optime este necesar să memorăm și indicele k, pentru care se obține valoarea minimă . Pentru aceasta
nu vom utiliza un alt tablou ,îl vom memora pe poziția simetrică față de diago nala principală
(M[j][i] ).
Strategia programării dinamice este implementată astfel:
Rezolvarea recursivă este ineficientă, deoarece subproblemele se suprapun,de aceea vom rezolva
problema în mod bottom -up: determinăm parantezarea optimală a expresiilor for mate din două valori,
apoi din 3 valori, 4 valori,etc.
Obținerea soluției optime se realizează recursiv, folosind informațiile d e sub diagonala p rincipală.
Pentru aceasta se va apela din main( ) Afisare(1,p) .
Codul programului C++
#include<fstream>
#includ e<iostream>
using namespace std;
int n,p,x[101],op[101][101],c[101][101],M[101][101],rez[101][101];
fstream f("eval.in",ios::in),
fout("eval.out",ios::out);
void citire()
{
int i,j;
f>>n>>p;
for(i=1;i<=p;i++) f>>x[i];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>op[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
f>>c[i][j];
}
void Rezolvare()
{ int nr, i, j, k, kmin, min, Infinit=10000;
for (i=1; i<=p; i++) rez[i][i]=x[i];
for (nr=2; nr<=p; nr++)

72 for (i=1; i<=p -nr+1; i++)
{j=i+nr -1;
for (k=i, min=Infini t; k<j; k++)
if (min > M[i][k]+ M[k+1][j]+c[rez[i][k]][rez[k+1][j]])
{min = M[i][k]+ M[k+1][j]+c[rez[i][k]][rez[k+1][j]];
kmin=k;}
M[i][j]=min; M[j][i]=kmin;
rez[i][j]=op[rez[i][kmin]] [rez[kmin+1][j]]; }}
void Afisare( int i, int j)
{ //afiseaza parantezarea optimala a expresiei xi…xj
if (i==M[j][i]) fout<<x[i];
else
{fout<<"("; Afisare(i,M[j][i]); fout<<")"; }
fout<<"o";
if (j==M[j][i]+1) fout<<x[j];
else
{fout<<"("; Afisare(M[j][i]+1,j); fout< <")"; }}
int main()
{
citire();
Rezolvare();
fout<<M[1][p]<<endl;
Afisare(1,p);
return 0;
}
9). Transformare de cuvinte
Se urmărește transformarea unui șir de caractere, denumit sursă, într -un alt șir de
caractere, denumit destinație, folo sind următoarele operații permise:
1. COPY (a) transferă caracterul a din sursă în destinație
2. DELETE (a) șterge caracterul a din sursă
3. INSERT (a) inserează caracterul a în destinație
4. REPLACE (a,b) înlocuiește caracterul a cu caracterul b (a dispare din sursă, iar
în destinație apare b)
5. TWIDDLE (ab) secvența ab din sursă se transformă în ba în destinație ( ab
dispare din sursă și apare ba în destinație)
6. KILL (secvența) după ce s -au efectuat toate operațiile necesare, se poate elimina
secve nța rămasă(sufixul) din cuvântul -sursă.
Numim transformare succesiunea de operații prin care din șirul -sursă se obține șirul
destinație. Fiecare operație are asociat un cost. Costul unei transformări este egal cu suma
costurilor operațiilor utilizate.
Date fiind șirul -sursă și șirul -destinație, să se determine o transformare de cost minim.

73 Exemplu
Pentru transformarea șirului -sursă ALGORITM în șirul -destinație ALTRUIST , se poate folosi
următoarea secvență de operații:
Operație Destinație Sursă
Copy (A) A LGORITM
Copy (L) AL GORITM
Replace (G,T) ALT ORITM
Delete (O) ALT RITM
Copy (R) ALTR ITM
Insert (U) ALTRU ITM
Copy (I) ALTRUI TM
Insert (S) ALTRUIS TM
Copy (T) ALTRUIST M
Kill (M) ALTRUIST
Date de intrare
În fișierul sir.in avem trei linii. Pe prima linie este specificat șirul -sursă, iar pe cea de a doua, șirul –
destinație. Pe cea de a treia linie se află 6 numere naturale separate prin câte un spațiu, care reprezintă
costurile celor 6 operații descrise mai sus(în ordinea din tabel).
Date de ieș ire
Fișierul de ieșire sir.ou t va conține pe prima linie costul transformării de cost minim. Pe următoarele
linii vor fi specificate operațiile executate în transformare.
Restricții
 Lungimea șirurilor de caractere nu depășește 100.
 Costurile operațiilor su nt numere naturale ≤ 100.
Identificarea subproblemelor
Să considerăm că X este șirul -sursă, de lungime m, iar Y este șirul -destinație, de lungime n. Să
notăm cu
sufixul lui X, care începe la poziția i (deci secvența de caractere

), și cu
sufixul lui Y, care începe la poziția j (secvența de caractere

).
Problema cere transformarea de cost minim a șirului X în șirul Y. O subproblemă presupune
determina rea unei transformari de cost minim a șirului
în șirul
,
i
{0,1,…,m -1} și
j
{0,1,…,n -1}.
Stabilirea structurilor de date
Observăm că în formularea unei subprobleme intervin două variabile: i(poziția de început a șirului
) și j (poziția de început a șirului
).Prin urmare, pentru a reține rezultatele subproblemelor și a
reconstitui soluția vom utiliza două tablouri bidimensionale, cm și op, fiecare cu câte m linii și n
coloane, cu semnif icația:
– cm[i][j] reprezintă costul transformării de cost minim a șirului
în șirul
;

74 – op[i][j] reprezintă prima operație executată pentru a transforma optimal
în
.
Evident, cm[0][0] reprezintă costul tra nsformării de cost minim a șirului X în șirul Y.
Determinarea relației de recurență
Pentru a transforma sufixul
în sufixul
vom executa toate operațiile posibile și vom alege
varianta pentru care se obține minimul. Relația de rec urență ce definește substructura optimală a este:
 cm[m][j]=(n -j)*cost(INSERT);
0
j
n(pentru a transforma șirul
vid în
trebuie să inserăm(n -j)caractere);
 cm[i][n]=min{cost(KILL),(m -i)*cost(DELETE)};
0
i
m (pentru a
transforma șirul
în șirul vid putem șterge succesiv cele m -i
caractere sau putem utiliza opera ția KILL);
 cm[n][m]=0(pentru a transforma șirul vid în șirul vid costul
este 0);
 cm[i][j]=min
{cost(COPY)+cm[i+1][j+1],dacă X[i]==Y[j]
cost(DELETE)+cm[i+1][j]
cost(INSERT)+cm[i][j+1]
cost(REPLACE)+cm[i+1][j+1]
cost(TWIDDLE)+cm[i+2][j+2],dacă X[i]==Y[j+1] și
X[i+1]==Y[j]
cost(KILL)+cm[m][ j]}
Strategia programării dinamice este implementată astfel:
Din cauza faptului că subproblemele se suprapun, o implementare recursivă este ineficientă. Vom
rezolva relația de recurență în mod bottom -up. Soluția o vom reconstitui pe baza informațiilor
memo rate în op.
Codul programului C++
#include<fstream>
#include<string.h>
#define DMax 101
#define COPY 0
#define DELETE 1
#define INSERT 2
#define REPLACE 3
#define TWIDDLE 4
#define KILL 5
using namespace std;
int n, m;
int cost[6];
int op[DMax][DM ax], cm[DMax][DMax];
char X[DMax],Y[DMax];
void Citire();
void Rezolvare();

75 void Afisare();
int main()
{Citire();
Rezolvare();
Afisare();
return 0;}
void Citire()
{int i;
fstream fin("sirt.in",ios::in);
fin.getline(X, DMax); m=strlen(X);
fin.getline( Y, DMax); n=strlen(Y);
for(i=0;i<6;i++) fin>>cost[i];
fin.close();
}
void Rezolvare()
{int i, j;
for (j=0; j<n; j++)
{cm[m][j]=(n -j)*cost[INSERT]; op[m][j]=INSERT;}
for (i=0; i<m; i++)
{cm[i][n]=cost[KILL]; op[i][n]=KILL;
if (cm[i][n]>(m -i)*cost[DELETE])
{cm[i][n]=(m -i)*cost[DELETE]; op[i][n]=DELETE;}
}
cm[n][m]=0;
for (i=m -1; i>=0; i –)
for (j=n -1; j>=0; j –)
{cm[i][j]=cost[KILL]+cm[m][j]; op[i][j]=KILL;
if (X[i]==Y[j] &&
cm[i][j]>cost[COPY]+ cm[i+1][j+1])
{cm[i][j]>cost[COPY]+cm[i+1][j+1];
op[i][j]=COPY; }
if (cm[i][j]>cost[DELETE]+cm[i+1][j])
{cm[i][j]=cost[DELETE]+cm[i+1][j];
op[i][j]=DELETE; }
if (cm[i][j]>cost[INSERT]+cm[i ][j+1])
{cm[i][j]=cost[INSERT]+cm[i+1][j];
op[i][j]=INSERT; }
if (cm[i][j]>cost[REPLACE]+cm[i+1][j+1])
{cm[i][j]=cost[REPLACE]+cm[i+1][j+1];
op[i][j]=REPLACE; }
if (i<m -1 && j<n -1 && X[i]= =Y[j+1] && X[i+1]==Y[j]
&& cm[i][j]>cost[TWIDDLE]+cm[i+2][j+2])
{cm[i][j]=cost[TWIDDLE]+cm[i+2][j+2];
op[i][j]=TWIDDLE; }
}}
void Afisare()
{int i, j;

76 ofstream fout("sirt.out");
fout<<cm[0][0]<<endl;
i=0; j=0;
while (i<m || j<n)
switch (op[i][j])
{
case COPY: fout<<"COPY \n"; i++; j++; break;
case DELETE: fout<<"DELETE \n"; i++; break;
case INSERT: fout<<"INSERT \n"; j++; break;
case REPLACE: f out<<"REPLACE \n"; i++; j++; break;
case TWIDDLE: fout<<"TWIDDLE \n"; i+=2; j+=2; break;
case KILL: fout<<"KILL \n"; i=m; break;
}
fout.close();}
10). Palindrom
Un palindrom este un cuvânt care, citit atât de la stânga la dreapta, cât și de la dreapta la
stânga, este același. Dacă un cuvânt nu este palindrom, el poate fi tăiat în mai multe părți care să
fie palindromuri.
Realizați un program care să determine numărul minim de palindromuri în care poate fi
împărțită o se cvență de caractere dată.
Date de intrare
În fișierul pal.in se dă pe prima linie o secvență de caractere (litere mici ale alfabetului englez).
Date de ieșire
Fișierul de ieșire pal.out conține pe prima linie numărul minim de palindromuri determinat.
Restr icție
Lungimea secvenței de caractere nu depășește 100.
Exemple
pal.in pal.out Explica ție pal.in pal.out Explica ție
anaban 2 a_naban abaccbcb 3 aba_cc_bcb
Identificarea subproblemelor
Problema cere să determinăm numărul minim de palindromuri în care poat e fi împărțit șirul s de
lungimea Lg. Să notăm cu
prefixul șirului s ce se termină pe poziția i, 0
i
Lg (deci șirul
format din caracterele
).
O subproblemă presupune determinarea numărului minim de palind romuri în care poate fi împărțit șirul
.

77 Stabilirea structurilor de date
Deoarece în formularea subproblemelor problemei date intervine numai variabila i, poziția de sfârșit a
prefixului, deducem că pentru a stoca soluțiile subproblemelor est e suficient un vector nrp cu Lg
componente, unde nrp[i ] reprezintă numărul minim de palindromuri din descompunerea șirului
,
0
i
Lg.
Deoarece problema nu cere și o modalitate de descompunere a șirului dat în număr mini m de
palindromuri, nu este necesară utilizarea altor structuri de date pentru a reține informațiile necesare
reconstituirii soluției.
Determinarea relației de recurență
Dacă șirul
este palindrom: nrp[i]=1 .
Dacă șirul
nu este pal indrom: nrp[i]=1+min{nrp[j], 0
j
i, și
este
palindrom).
Strategia programării dinamice este implementată astfel:
Pentru că subproblemele se suprapun, vom rezolva relația de recurență în mod bottom -up, determinând
număr ul minim de palindromuri din prefixul de lungime l, apoi din prefixul de lungime 2 ș.a.m.d.
Pentru implementare este necesară o funcție care să testeze dacă o subsecvență a șirului dat este sau nu
palindrom.
Codul programului C++
#include<fstream>
#includ e<string.h>
using namespace std;
#define LgMax 101
fstream fin("pal.in",ios::in);
fstream fout("pal.out",ios::out);
char s[LgMax];
int Lg;
int rez;
void citire ()
{ fin>>s;
Lg = strlen(s);
fin.close();
}
int palindrom(int inceput, int sfarsit)
{ while (inceput<sfarsit)
{ if (s[inceput]!=s[sfarsit])return 0;
inceput++; sfarsit –;
}
return 1;
}
void dinamic(void)

78 { int i, j, nrp[LgMax], nrmin;
for (i=0; i<Lg; i++)
if (palindrom(0,i)) nrp[i]=1;
else
{nrmin=LgMax+2;
for(j=0; j<i; j++)
if (palindrom(j+1,i) && nrp[j]<nrmin)
nrmin=nrp[j];
nrp[i]=nrmin+1;
}
rez=nrp[Lg -1];
}
void afisare( )
{ fout<<rez<<endl;
fout.close(); }
int main(void)
{ citire();
dinamic();
afisare();
return 0; }

11). Suma
La pensionare din suljba sultanului , pentru fiecare zi de lucru , marele vizir să primească o
primă stabilită la marele sfat. Vizirul Magir primește pentru 5 zile de activitate suma totală de
411 galbeni , fiindcă în cadrul marelui sfat s -a stabilit pentru prima zi suma de 53 de galbeni, iar
în ziua a d i 200 de galbeni , ziua trei 12 galbeni, ziua patru 144 de galbeni, iar pentru ultima zi 2
galbeni.
Vizirul Jibal , primește onoarea ca, la pensionare , să schimbe sumele stabilite de sfatul țării,
dar nu foarte mult. Ceea ce poate face el este să unească cifrele sumelor sta bilite și să le separe
apoi , astfel încât suma obținută pe zi să nu fie mai mare de 999 de galbeni și pentru fiecare zi
lucrată să obțină cel puțin un galben. Deci, cu doar 5 zile lucrate , plătite cu 23, 417, 205, 5 și
respectiv 40 de galbeni, în total 680 de galbeni, el poate cere : în prima zi 2 galbeni, a doua 3, a
treia 417 , a patra 205 , iar a cincea 540 de galbeni, obținând astfel 1167 de galbeni în total.
Pentru numărul de zile n și cele n sume stabilite de sfatul țării pentru Jibal, realiza ți un progr am
care să determine cea mai mare sumă pe care o poate primi prin unirea și despărțirea cifrelor
sumelor date.
Date de intrare
Fișierul suma.in conține un număr natural n pe prima linie , reprezentând numărul de zile de
activitate. Pe linia următoare se afl ă n numere naturale separate prin spații,


, reprezentând
sumele atribute de sfatul țării.
Date de ieșire

79 Fișierul de ieșire suma.out va conține o singură linie pe care va fi afișat un singur număr natural,
reprezentând prima totală maximă ce se poate obține.
Restricții și precizări
 1
n
501.
 0
1000,pentru orice 1≤i≤n.
 În orice distribu ție, nici o sumă nu poate să înceapă cu 0.
 Orice sumă dintr -o distribu ție trebuie să fie ne nulă.
Exemplu
suma.in suma.out Explica ție
5
23 417 205 5
40
1608 Prima maximă(1608) se ob ține
pentru
distribu ția: 2 341 720 5 540

Soluție
Vom concatena cifrele numerelor din șirul dat și vom obține un șir de cifre (să -l notăm a) de lungime L
(L este ma xim n*3).
Identificarea subproblemelor
Problema cere să împărțim șirul de cifre a în n numere nenule, a căror sumă să fie maximă. Să notăm
cu
prefixul de lungime p al șirului a. O subproblemă constă în a împărți
în m numere nenu le a
căror sumă să fie maximă.
Stabilirea structurilor de date
Deoarece în formularea subproblemelor intervin două variabile ( p, lungimea prefixului, și m, numărul
de valori nenule ce se vor obține), deducem că este necesar un tablou bidimensional smax cu L linii și
n coloane, cu semnificația că smaxpm reprezintă suma maximă ce se poate obține adunând cele m
numere în care împărțim pe
sau -1, dacă o astfel de împărțire nu se poate obține.
Determinarea relației de recurență
Studiem în primul râ nd cazurile elementare, pentru p=1,2,3 :
 smax[1][1]=a[1]; smax[1][m]= -1, pentru m=2,n;
 smax[2][1]=a[1]*10+a[2];
 smax[2][2]= -1, dacă a[2]=0 sau a[1]+a[2], dacă a[2]
0;
 smax[2][m]= -1, pentru m=3,n;
 smax[3][1]=a[1]*100+a[2]*10+a[3];
 smax[3][2]=max

 smax[3][3]=a[1]+a[2]+a[3], dacă a[2]
0 și a[2]
0 sau-1, astfel:

80  smax[3][m]= -1, pentru m=4,n.
Forma generală, pentru p
2:
smax[p][m]=max
{ smax[p -1][m-1]+a [p], dacă a [p]
0
//al m-lea număr este format numai din cifra a [p]
smax[p-2][m-1]+a [p-1]*10+ a [p], dacă a [p -1]
0
// al m-lea număr este format din cifrele a [p -1] a [p]
smax[p-3][m-1]+a [p-2]*100+ a [p -1]*10+ a [p], dacă a [p -2]
0
// al m-lea numă r este format din cifrele a [p -2] a [p-1] a [p]
-1,dacă a [p -2]= a [p -1]= a [p]=0
}
Strategia programării dinamice este implementată astfel:
Vom rezolva recurența în mod bottom -up, determinând suma maximă pentru prefixul de lungime 1,
apoi pentru prefix ul de lungime 2, 3, …, L .
Observăm că pentru a calcula linia p din matricea smax sunt necesare numai liniile p-1, p-2 și p-
3. Deci nu este necesar să stocăm toată matricea smax , sunt suficiente aceste 3 linii și linia curentă, pe
care urmează să o calcul ăm. Deci, matricea smax va avea 4 linii și n coloane. Inițializăm liniile 1,
2, 3 conform relațiilor precedente. La fiecare pas i=4, L determinăm linia i%4 a matricei smax .
Codul programului C++
#include <fstream>
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
#define maxn 2000
fstream fin("sumav.in",ios::in);
fstream fout("sumav.out",ios::out);
long smax[4][maxn];
int a[maxn], L, n;
char sir[maxn];
void Citire()
{ int i;
char sir_nr[16];
fin>>n;
for (i=0; i<n; i++)
{
/*citim numarul curent intr -un sir de caractere*/
fin>>sir_nr;
/*concatenam numarul curent la sirul cifrelor*/
strcat(sir, sir_nr);
}

81 /*determin numarul total de cifre*/
L=strlen(sir);
/*transform caracterele in cifre*/
for (i=1; i<=L; i++)
a[i]=sir[i -1]-'0';
fin.close();
}
void Rezolvare(void)
{int i, j;
long suma;
/*initializare*/
for (i=0; i<4; i++)
for (j=0; j<=n; j++) smax[i][j]= -1;
smax[0][0]=0; smax[1][1]=a[1]; smax[2][1]=a[1]*10+a[2];
if (a[2]) smax[2][2]=a[1]+a[2];
smax[3][1]=a[1]*100+a[2]*10+a[3];
if (a[2]) smax[3][2]=a[1]+a[2]*10+a[3];
if (a[3] && smax[3][2]<a[1]*10+a[2]+a[3])
smax[3][2]=a[1]*10+a[2]+a[3];
if (a[2] && a[3])
smax[3][3]=a[1]+a[2]+a[3];
// cout<<smax[0][0]<<" "<<smax[1][1]<<" "<<smax[2][1]<<" "<<smax[2][2]<<" "<<smax[3][1]<<"
"<<smax[3][2];
for (i=4; i<=L; i++)
{
smax[i%4][0]=smax[i%4][1]= -1;
for (j=2; j<=i; j++)
{ if (a[i]==0) smax[i%4][j]= -1;
else
{
/* folosim o singura cifra */
if (smax[(i -1+4)%4][j -1]!=-1)
{suma=smax[(i -1+4)%4][j -1]+a[i];
smax[i%4][j]=suma;}
}
if (a[i -1]>0)
{
/* folosim doua cifre */
if (smax[(i -2+4)%4][j -1]!=-1)
{suma=smax[(i -2+4)%4][j -1]+a[i -1]*10+a[i];
if (suma>smax[i%4][j]) smax[i%4][j]=suma;}
}
if (a[i -2]>0)
{
/* folosim trei cifre */
if (smax[(i -3+4)%4][j -1]!=-1)
{suma=smax[(i -3+4)%4][j -1]+ a[i -2]*100+a[i -1]*10+a[i];

82 if (suma>smax[i%4][j]) smax[i%4][j]=suma;}
}
}
}
}
void Afisare(void)
{int i,j;
fout<<smax[L%4][n];
fout.close();
}
int main(void)
{Citire();
Rezolvare();
Afisare();
return 0; }
12). Lăcusta
Se consideră A o structură de date bidimensională cu m linii și n coloane cu componente
numere naturale. Tr aversăm matricea pornind de la colțul din stânga -sus la colțul din dreapta -jos,
făcând câte o săritură pe orizontală și un pas pe verticală.
O săritură presupune că ne putem deplasa de la o celulă la alta poziționată pe aceeași linie, iar
un pas înseamnă c ă ne putem deplasa din celula în care suntem sub ea. Deci , traversarea presupune
vizitarea a 2*m celule.
Găsiți traversarea pentru care suma celulelor vizitate este maximă.
Date de intrare
Fișierul de intrare lacusta.in conține pe prima linie două numere n aturale separate prin spațiu, m și
n, cu semnificația din enunț. Următoarele m linii conțin elementele matric ii, fiecare linie cu câte n
numere. Numerele de pe aceeași linie sunt separate prin câte un singur spațiu.
Date de ieșire
Prima linie a fișierului de ieșire lacusta.out va conține suma minimă.
Restricții
 3≤m, n≤100;
 A[i][j]≤255,
0≤i
m, 0≤j
n.
Exemplu
lacusta.in lacusta.out Explica ție
4 5
3 4 5 7 9
6 6 3 4 4
6 3 3 9 6
6 5 3 8 2 28 Drumul este:
[1,1]-[1,3]-[2,3]-[2,2]-
[3,2]-[3,3]-[4,3]-[4,5]

83
Identificarea subproblemelor
Problema cere determinarea sumei minime ce se poate obține din colțul sin stânga -sus (A[0][0] )
până în colțul din dreapta -jos (A[m-1][n-1]), traversând matricea în condițiile specifica te.
O subproblemă constă în determinarea sumei minime, care se poate obține pornind din colțul din
stânga -sus până la fiecare element A[i][j] al matricei,
i, j; 0
i
m, 0
j
n.
Stabilirea structur ilor de date
Pentru a memora soluțiile subproblemelor vom construi o matrice B, cu m linii și n coloane, cu
semnificația că B[i][j] reprezintă suma minimă care se poate obține din colțul stânga -sus până la
elementul A[i][j].
Evident, soluția problemei date este:
min{ B[m -1][j] | 0
j
n-1 }+A[m-1][n-1]
Determinarea relației de recurență
 B[0][0]=A[0][0]
 B[0][i]=
,
0
i
n
(Nu putem ajunge la elementul A[0][i] făcând un salt și un pas.)
 B[1][0]=

(Nu putem ajunge la elementul A[1][0] făcând un salt și un pas.)
 B[1][j]=A[0][0]+A[0][j]+A[1][j],
0
j
n
(Facem un salt până la elementul A[0][j], apoi un pas până la A[1][j].)
 B[i][j]=A[i][j]|A[i -1][j]+min{B[i -1][k]|
0
k
n, k
j}
 Pentru a ajunge în A[i][j]am făcut un pas de pe elementul A[i –
1][j], iar pentru a ajunge pe elementul A[i -1][j] am făcut un
salt.
 Elementul A[i -1][kmin] de pe care se face saltul e ste ales
astfel încât să B[i -1][kmin]=min{B[i -1][k]|
0
k
n, k
j}.
Strategia programării dinamice este implementată astfel:
Subproblemele problemei ce se rezolvă prin această metodă nu sunt independente , deci vom rezolva
relația de recurență în mod bottom -up, determinând suma minimă ce se poate obține pe un traseu într -o
matrice de două linii, de trei linii ș.a.m.d.
În calculul lui B[i][j] este posibil să întâmpinăm o problemă: elementul minim de pe linia i-1 să
se găsească chiar pe coloana j. În această eventualitate, vom calcula min1 și min2, două valori
minime de pe linia i-1.

84
Codul programului C++
#include <fstream>
using namespace std;
#define M 100
int main ()
{ fstream fin("lacusta.in",ios::in);
fstre am fout("lacusta.out",ios::out);
unsigned A[M][M], B[M][M], m, n, i, j, min1, min2, jmin;
fin>> m>>n;
for (i=0; i<m; i++)
for (j=0; j<n; j++)
fin>>A[i][j];
fin.close();
B[1][0]=32000; //infinit
for (i=1; i<n; i++) //ini tializarea celei de -a doua linii
B[1][i]=A[0][0]+A[0][i]+A[1][i];
for (i=1; i<m -1; i++)
{//calculez doua valori minime pe linia i
if (B[i][0]<=B[i][1])
{min1=B[i][0]; min2=B[i][1]; jmin=0; }
else
{min1=B[ i][1]; min2=B[i][0]; jmin=1; }
for (j=2; j<n; j++) //parcurgem linia
if (B[i][j]<min1)
{min2=min1; min1=B[i][j]; jmin=j; }
else
if (B[i][j]<min2) min2=B[i][j];
for (j=0; j<n; j++)
if (j!=jmin)
B[i+1][j]=min1+A[i][j]+A[i+1][j];
else
B[i+1][j]=min2+A[i][j]+A[i+1][j];
}
min1=B[m -1][0];
for (j=1; j<n; j++)
if (B[m -1][j]<min1)
min1=B[m -1][j];
fout<< min1+A[m -1][n-1];
fout .close();
return 0;
}

85 13). Paragrafare optimală
Se consideră o secvență de N cuvinte și un număr natural M. Se cere să se formeze o pagină de
text din aceste cuvinte în felul următor:
– fiecare linie a textului să fie de cel mult M caractere;
– ordinea cuvi ntelor rămâne cea din secvența inițială;
– două cuvinte vor fi separate prin exact câte un spațiu;
– pe fiecare rând vor fi puse un număr întreg de cuvinte.
O astfel de aranjare în pagină se numește paragrafare .
Se notează cu
,
,…,
numărul de spații rămase libere la sfârșitul fiecărui rând, cu excepția
ultimului. Costul unei paragrafări este
+
+…+
.
Să se determine o paragrafare optimală (de cost minim).
Fișierul de intrare text.in va conține pe prima linie numerele naturale N și M, separate printr -un
spațiu. Pe fiecare dintre următoarele N linii este scris un cuvânt.
Fișierul de ieșire text.out va conține pe prima linie costul paragrafării optimale În continuare, în
fișier va fi scri să pagina de text formatată conform cerințelor din enunț.
Restricții
 1
N
100;
 1
M
50;
 Lungimea unui cuvânt
M.
Exemplu
text.in text.out
17 15
A
fost
odata
ca-n
povesti
a
fost
ca
niciodata
din
rude
mari
imparatesti
o
prea
frumoasa
fata 510
A fost odata
ca-n povesti
a fost ca
niciodata
din rude mari
imparatesti o
prea frumoasa
fata

86 Identificarea subproblemelor
Vom considera ca subproblemă a problemei date paragrafarea optimală a secvenței formată din
cuvintele i, i+1,…,N, cu 1
i
N.
Stabilirea structurilor de date
În formularea unei subprobleme intervine o singură virgulă( i, numărul de cuvinte din secvență).Prin
urmare, pentru a reține costul paragrafării optimale este nec esar un vector cost cu N componente,
unde cost[i] reprezintă costul paragrafării optimale a cuvintelor i, i+1,…,N .
Deoarece problema solicită și soluția optimă, nu numai costul acesteia, este necesar să reținem
informații suplimentare care să ne permită reconstituirea soluției. Vom folosi un vector ultim cu N
elemente , știind că ultim[i] reprezintă ultimul cuvânt de pe linia pe care este plasat cuvântul i.

Determinarea relației de recurență
Evident, cost[N]=0 , deoarece spațiile suplimentare de pe ultima linie a paragrafului nu se
contorizează și ultim[N]=N .
Să determinăm cost[i] .
Dacă toate cuvintele i, i+1,…,N încap pe aceeași linie, atunci cost[i]=0 și ultim[i]=N .
În caz contrar, va trebui să distribuim cuvintele i, i+1,…,N pe mai multe linii.
Cuvân tul i poate fi plasat singur pe o linie. În acest caz, costul paragrafării va fi
+
cost[i+1] , unde cu lg[i] am notat lungimea cuvântului i, iar ultim[i]=i.
Cuvântul i poate fi plasat pe aceeași linie c u alte cuvinte (i+1, i+2, …, j ), cu i
j
N,
dacă este posibil ( lg[i]+ lg[i+1]+…+ lg[j]+j -i
M).
În acest ultim caz, ultim[i]=j , iar costul paragrafării va fi
+ cost[j+1].
Evident, se va alege varianta pentru care se obține minimul.
Strategia progr amării dinamice este implementată astfel:
Vom rezolva relația de recurență în mod bottom -up. Pentru a optimiza algoritmul vom utiliza un vector
slg cu N componente, având semnificația că slg[i] reprezintă suma lungimilor cuvintelor 1, 2,
…, i .

87 Codul pro gramului C++
#include <fstream>
#include <string.h>
#define NMax 101
#define MMax 51
#define p3(x) ((x)*(x)*(x))
using namespace std;
int N, M;
int slg[NMax];
char c[NMax][MMax];
long cost[NMax], ultim[NMax];
fstream fin("text.in",ios::in);
fstream fout("t ext.out",ios::out);
void citire()
{int i;
fin>>N>>M;
fin.get();
for (i=1; i<=N; i++)
{fin.getline(c[i], MMax);
slg[i]=slg[i -1]+strlen(c[i]); }
fin.close();
}
void dinamica()
{int i, j;
cost[N]=0; ultim[N]=N;
for (i=N -1; i>0; i –)
if (slg[N] -slg[i-1]+N -i<=M)
//cuvintele i, i+1, …, N incap pe ultima linie?
{cost[i]=0; ultim[i]=N;}
else
{//cuvantul i este plasat singur pe o linie
cost[i]=p3(M -slg[i]+slg[i -1])+cost[i+1];
ultim[i]=i;
for (j=i+1; j<N; j++)
//plasam cuvintele i, …, j pe aceeasi linie
{if (slg[j] -slg[i-1]+j-i>M) //daca nu incap
break;
if (cost[i]>cost[j+1]+p3(M -(slg[j] -slg[i-1]+j-i)))
{cost[i]=cost[j+1]+p3(M -(slg[j] -slg[i-1]+j-i));
ultim[i]=j; }
}
}
}
void afisare()
{int i, poz;
fout<<cost[1]<<endl;

88 poz=0; //ultimul cuvânt afisat
while (poz+1<=N)
{
for (i=poz+1; i<ultim[poz+1]; i++)
fout<<c[i]<<' ';
fout<<c[ultim [poz+1]]<<endl;
poz=ultim[poz+1];
}
fout.close(); }
int main()
{
citire();
dinamica();
afisare();
return 0;
}
14). Scara
Domnul G are de urcat o scară cu n trepte. În mod normal, la fiecare pas pe care îl face, el urcă
o treaptă. Pe k dintre aceste trepte se află câte o sticlă cu un număr oarecare de decilitri de apă, fie
acesta x. Dacă bea toată apa dintr -o astfel de sticlă , forța și mobilitatea lui G cresc, astfel încât, la
următorul pas, el poate urca până la x trepte, după care, da că nu bea din nou, revine la
„normal”.Sticlele cu apă nu costă nimic. Cantitatea de apă conținută de aceste sticle poate să difere
de la o treaptă la alta.
Pe j trepte se află câte o sticlă cu băutură energizantă. Și pentru aceste sticle, cantitatea de bău tură
energizantă poate să difere de la o treaptă la alta. Să presupunem că într -una dintre aceste sticle
avem y decilitri de băutură energizantă. Dacă bea q (q
y) decilitri dintr -o astfel de sticlă, la următorul
pas G poate urca până la 2q trep te, după care, și în acest caz, dacă nu bea din nou, el revine la
„normal”.Însă băutura energizantă costă: pentru o cantitate de q decilitri consumați, G trebuie să
plătească q lei grei.
Pot exista trepte pe care nu se află nici un pahar, dar și trepte pe care se află atât o sticlă cu apă cât și
una cu băutură energizantă. În astfel de situații, nu are rost ca G să bea ambele băuturi, deoarece
efectul lor nu se cumulează; el poate să alege să bea una dintre cele două băuturi sau poate să nu bea
nimic.
Deter minați p, numărul minim de pași pe care trebuie să îi facă G pentru a urca scara, precum
și suma minimă ce trebuie să o cheltuiască pentru a urca scara în p pași.
Fișierul text de intrare scara.in conține:
– pe prima linie, un număr natural n, reprezentând n umărul total de trepte;
– pe cea de a doua linie, un număr natural k, reprezentând numărul de trepte pe care se află sticle
cu apă;
– pe fiecare dintre următoarele k linii, câte două numere naturale separate prin spațiu,
reprezentând numărul de ordine al trept ei pe care se află o sticlă de apă și, respectiv, cantitatea
de apă din acea sticlă, exprimată în decilitri;

89 – pe următoarea linie, un număr natural j, reprezentând numărul de trepte pe care se află sticle cu
băutură energizantă;
– pe fiecare dintre următoarel e j linii, câte două numere naturale separate prin spațiu,
reprezentând numărul de ordine al treptei pe care se află o sticlă cu băutură energizantă și,
respectiv, cantitatea de băutură energizantă din acea sticlă, exprimată în decilitri.
În fișierul de ie șire scara.out vom avea o singură linie cu două numere naturale, p și c, separate, p
însemnând numărul minim de pași făcuți , iar c suma minimă cheltuită.
Restricții
 n
120.
 0
k
n.
 0
j
n.
 Cantitatea de apă aflată în orice sticlă este 1
x
100.
 Cantitatea de energizant aflată în sticlă este 1
y
100.

Exemple
scara.in scara.out scara.in scara.out
6
1
1 2
2
4 1
1 2 3 2 6
1
1 2
2
4 1
1 1
4 1
Identificare a subproblemelor
Vom considera ca subproblemă a problemei date determinarea numărului minim de pași pentru a urca
treptele 1, 2, …, i și a sumei minime cheltuite pentru a urca treptele 1, 2, …, i , cu
număr minim de pași.
Stabilirea structurilor de date necesare
Pentru a reține informațiile despre sticlele de apă, respectiv sticlele de suc vom utiliza doi vectori (apa
și suc) cu N componente, cu semnificațiile:
 apa[i] reprezintă cantitatea de apă aflată pe treapta i;
 suc[i] reprezintă cantitatea de suc a flată pe treapta i.
Pentru a memora soluțiile subproblemelor folosim doi vectori ( nrpasi și sum) cu N componente, cu
semnificațiile:
 nrpasi[i] reprezintă numărul minim de pa și necesari pentru a
urca treptele 1,…,i;
 suc[i] reprezintă suma minimă cheltuită pentru a urca treptele
1,2,…,i cu nrpasi[i] pași.

90 Determinarea relației de recurență
Dacă ne aflăm pe scara i avem trei posibilități:
– facem un pas „normal” ; în acest caz, vom ajunge pe treapta i+1 și verificăm dacă această
modalitate de a ajunge pe trea pta i+1 este mai eficientă
(nrpasi[i+1]>nrpasi[i]+1||nrpasi[i+1]==nrpasi[i]+1&&sum[i+1]>sum[i] );
– dacă avem apă, atunci bem q dl de apă (q=1, apa[i] ) și ajungem făcând un singur pas pe
treapta i+q; verificăm dacă această modalitate de a ajunge pe treapta i+ q este mai eficientă
(nrpasi[i+q]>nrpasi[i]+1||nrpasi[i+q]==nrpasi[i]+1&&sum[i+q]>sum[i] );
– dacă avem suc, bem q dl de suc (q=1, suc[i] ) și ajungem făcând un singur pas pe
treapta i+2q ; verificăm, de asemenea, dacă această modalitate de a ajunge pe treapta i+2q
este mai eficientă, caz în care o reținem.
Codul programului C++
#include <fstream>
#define MAX_N 121
#define INF 10000
#define cmp(a, b, c, d) (((a)<(c))||((a)==(c) && (b)<(d)))
using namespace std;
int N, apa[MAX_N], suc[MAX_N];
int nrpasi[MAX_N], s um[MAX_N];
void citire()
{int i, j, K;
fstream fin("scara.in",ios::in);
fin>>N; fin>>K;
for (; K>0; K –){fin>>i>>j; apa[i]=j; }
fin>>K;
for (; K>0; K –) {fin>>i>>j; suc[i]=j; }
fin.close();}
void afisare()
{fstream fout("scara.out",ios::out);
fout<<nrp asi[N]<<" "<<sum[N]; fout.close();}
void dinamic()
{int i, q;
nrpasi[1]=1;
for (i=2; i<=N; i++) nrpasi[i]=INF;
for (i=1; i<=N; i++){ //fac un pas "normal"
if (i<N && cmp(nrpasi[i]+1,sum[i],nrpasi[i+1],sum[i+1]))
{ nrpasi[i+1]=nrpasi[i]+1; sum[i +1]=sum[i]; }
//daca este apa pe treapta i
if (apa[i])
for (q=1; q<=apa[i] && i+q<=N; q++)
//beau q dl de apa

91 if (cmp(nrpasi[i]+1,sum[i],nrpasi[i+q],sum[i+q])) {nrpasi[i+q]=nrpasi[i]+1;
sum[i+q]=sum[i]; }
//daca exista suc pe treapta i
if (suc[i])
for (q=1; q<=2*suc[i] && i+q<=N; q++)
//beau q dl de suc
if (cmp(nrpasi[i]+1,sum[i]+((q+1)/2),nrpasi[i+q],sum[i+q])) { nrpasi[i+q]=nrpasi[i]+1;
sum[i+q]=sum[i]+((q+1)/2); }
}}
int main()
{ citire();
dinamic();
afisare();
return 0;}
15). Poliție
Gigel și Costel sunt doi polițiști cu experiență. Ei lucrează împreună de mulți ani și de multe ori
au fost nominalizați pentr u premiul „Polițistul anului”. Anul acesta sunt hotărâți să -l câștige și pentru
aceasta trebuie să încaseze cât mai mulți bani din amenzi. În fiecare zi, Gigel și Costel stau în tură T
minute și pot aplica trei tipuri de amenzi:
Tip Semnificație Suma încas ată Durata de
aplicare
1. Pentru pietoni care traversează
neregulamentar S1 T1
2. Pentru șoferi de autovehicule care
încalcă regulile de circulație S2 T2
3. Pentru șoferi de mașini grele, cu
transport ilegal de mărfuri S3 T3
Amenzile de tipul 1și 2 pot fi aplicate de un singur polițist (Gigel sau Costel).Pentru o amendă de tipul
3, Gigel și Costel trebuie să lucreze împreună (unul verifică actele de transport, iar celălalt verifică
marfa).
Durata de aplicare a unei amenzi reprezintă timpul necesar poliț iștilor pentru a verifica acte, a scrie
proces -verbal etc. Dacă un polițist trebuie să aplice o amendă la momentul x, iar durata aplicării
amenzii este y, polițistul care aplică amenda va deveni disponibil abia la momentul x+y. Polițiștii nu
fac minute sup limentare (mai exact, ei sunt în activitate din minutul 1 până în minutul T
inclusiv).Pentru că în noul cod rutier nu le mai este permis polițiștilor să tragă șoferii pe dreapta și să -i
lase să aștepte, pentru a aplica o amendă de tipul 1 sau 2 trebuie să fie liber măcar un polițist, iar
pentru a aplica o amendă de tipul 3, ambii polițiști trebuie să fie liberi la momentul în care survine
evenimentul.
Punctul de observație de la intrarea în oraș comunică prin stație celor doi polițiști evenimentele din
trafic, în ordinea în care acestea survin. Dacă nu pot aplica amenzi pentru toate evenimentele ce
intervin în trafic, ei vor fi nevoiți să le aleagă pe acelea care le aduc mai mulți bani.
Realiza ți un program care să determine suma maximă pe care Gigel și Cost el o pot încasa din
amenzi, într -o tură.

92 Fișierul de intrare politie.in conține:
– pe prima linie, numărul natural T, reprezentând durata turei exprimată în minute;
– pe linia a doua, două numere naturale, S1 T1 (suma încasată și durata aplicării unei amenzi d e
tipul 1);
– pe linia a treia, două numere naturale, S2 T2 (suma încasată și durata aplicării unei amenzi de
tipul 2);
– pe linia a patra, două numere naturale, S3 T3 (suma încasată și durata aplicării unei amenzi de
tipul 3);
– pe linia a cincea, un număr N (numărul de evenimente survenite în trafic);
– pe fiecare dintre următoarele N linii se află două numere naturale, tip timp (tip poate fi 1, 2 sau
3 și reprezintă tipul amenzii ce poate fi aplicată; timp reprezintă timpul la care a survenit
evenimentul, exprim at în număr de minute față de începutul turei).
Numerele scrise pe aceeași linie sunt separate prin câte un spațiu. Evenimentele sunt în ordine
cronologică.
Fișierul de ieșire politie.out conține o singură linie pe care este scrisă suma maximă ce poate fi
încasată.
Restricții
 0
T, T1, T2, T3
201
 0
S1, S2, S3
51
 0
N
501
Exemple
politie.in politie.out Explica ție
300
10 20
30 30
50 25
8
1 5
3 10
3 20
1 130
2 142
2 160
3 180
2 280 140 Aplică amândoi amenda de tipul 3 din
minutul
10, apoi Costel aplică singur amenda de
tipul 1
din minutul 130, apoi Gigel aplică singur
amenda de tipul 2 din minutul 142, apoi
amândoi aplică amenda de tipul 3 din
minutul 180.
Identificarea subproblemelor
Vom c onsidera ca subproblemă a problemei date determinarea sumei maxime ce o pot încasa cei doi
polițiști, penalizând prin amenzi evenimentele i, i+1,…,N , în condițiile în care polițistul 1 este
disponibil la momentul t1, iar polițistul 2 este disponibil la m omentul t2.
Stabilirea structurilor de date

93 Deoarece în formularea unei subprobleme intervin trei variabile, vom utiliza pentru memorarea
soluțiilor subproblemelor un tablou tridimensional smax[N][T][T ], cu semnificația că
smax[i][t1][t2] reprezintă suma m aximă ce o pot încasa cei doi polițiști cu amenzile i, i+1,
…,N , în condițiile în care polițistul 1 este disponibil la momentul t1, iar polițistul 2 este disponibil
la momentul t2.
Determinarea relației de recurență
Dacă evenimentul i este de tip 1 sau 2, atunci, pentru a calcula smax[i][t1][t2] vom alege
dintre următoarele două cazuri varianta optimă:
a) primul polițist dă amenda i, dacă este posibil ( t1
timpul de aplicare a amenzii i);
b) al doilea polițist dă amenda i, dacă este posibil ( t2
timpul de aplicare a amenzii i).
/*primul poli țist dă amenda */
Dacă (t1<=t) atunci
Dacă (smax[i][t1][t2]< S[tip]+smax[i+1][t+T[tip]][t2])
smax[i][t1][t2]= S[tip]+smax[i+1][t+T[tip]][t2];
/*al doilea poli țist dă a menda */
Dacă (t2<=t) atunci
Dacă (smax[i][t1][t2]< S[tip]+smax[i+1][t1][t+T[tip]])
smax[i][t1][t2]= S[tip]+smax[i+1][t1][t+T[tip]];
Dacă evenimentul i este de tip 3 , ambii polițiști dau amenda, dacă este posibil (adică dacă t1 și t2
timpul de aplicare a amenzii i):
Dacă (t1<=t && t2<=t) atunci
Dacă (smax[i][t1][t2]< S[3]+smax[i+1][t+T[3]][t+T[3]])atunci
smax[i][t1][t2]= S[3]+smax[i+1][t+T[3]][t+T[3]]);
Vom rezolva relația de recurență în mod bottom -up. Obser văm că, pentru a calcula optimul amenzilor
i,i+1, …, n , este necesar să cunoaștem valorile optime pentru amenzile i+1, …, n .
Prin urmare, pentru implementare nu este necesar să utilizăm un tablou tridimensional. Sunt suficiente
două matrice pătratice T linii și T coloane (un tablou reține datele de la pasul precedent, iar în celălalt
tablou calculăm valorile de la pasul curent).
Codul programului C++
#include<fstream>
#include <stdlib.h>
using namespace std;
#define NMax 501
#define TMax 302
int nr, S[4 ], T[4], Tura;
struct Ev {int timp; char tip;} e[NMax];
unsigned int * smax1[TMax], * smax2[TMax];
fstream fin("politie.in",ios::in);
fstream fout("politie.out",ios::out);
void citire()
{int x, y, i, N, j;
fin>>Tura;

94 for (i=1; i<4; i++)fin>>S[i]>>T[i];
fin>>N;
nr=0;
for (i=1; i<=N; i++)
{fin>>x>>y;
if (y+T[x]<=Tura) {nr++; e[nr].timp=y; e[nr].tip=x;}
}
for (i=0; i<=Tura+1; i++)
{smax1[i]=(unsigned *) calloc(Tura+2, sizeof(unsigned));
if (!smax1[i])
{fout<<"Memorie insufu cienta"<<endl; exit(1);}}
for (i=0; i<=Tura+1; i++)
{smax2[i]=(unsigned *) calloc(Tura+2, sizeof(unsigned));
if (!smax2[i])
{fout<<"Memorie insuficienta"<<endl; exit(1);}
}
for (i=0; i<=Tura+1; i++)
for (j=0; j<=Tura+1; j++)
smax1[i][j]=smax2[i][j]=0;
fin.close();}
void afisare(void)
{ fout<<smax2[1][1];
fout.close(); }
void rezolva(void)
{int t, tip, i, t1,t2;
for(i=nr; i>=1; i –)
{ t=e[i].timp; tip=e[i].tip;
for (t1=Tura; t1>=1; t1 –)
for (t2=Tura; t2>=1; t2 –)
{ if (tip<3)
{/*primul politist da amenda */
if (t1<=t)
if (smax1[t1][t2]<S[tip]+smax2[t+T[tip]][t2])
smax1[t1][t2]=S[tip]+smax2[t+T[tip]][t2];
/*al doilea politist da amenda */
if (t2<=t)
if (smax1[t1][t2]<S[tip]+smax2[t1][t+T[tip]])
smax1[t1][t2]=S[tip]+smax2[t1][t+T[tip]];}
else
{if (t1<=t && t2<=t)
if (smax1[t1][t2]<S[3]+smax2[t+T[3]][t+T[3 ]])
smax1[t1][t2]=S[3]+smax2[t+T[3]][t+T[3]];}}
for (t1=Tura; t1>=1; t1 –)
for (t2=Tura; t2>=1; t2 –)
smax2[t1][t2]=smax1[t1][t2];}}
int main()
{citire(); rezolva(); afisare(); return 0;}

95 16). Probleme propuse
a. Nivel clasă
1. Să se determine numărul subșirurilor crescătoare de lungime maximă.
2. Să se determine subșirul crescător de lungime maximă, cel mai mic din punct de vedere
lexicografic.
3. Să se determine lungimea subșirului crescător de lungime minimă.
4. Se dau două șiruri A și B, ambele de lungime n, cu n par. Se știe că în ambele șiruri
fiecare număr de la 1 la n/2 apare de exact 2 ori. Să se determine lungimea maximă a unui
subșir comun al celor două șiruri.
5. Fiind dat un șir de n numere să se afișeze t oate șirurile de m numere distincte ce se pot
forma astfel încât două numere alăturate să nu aibă aceeași sumă a cifrelor.
b. Nivel cerc
1. Se dau n cutii, cutia numărul i având înălțimea h(i), lățimea w(i) și lungimea l(i).
Implementați un algoritm care să p ermită aranjarea cutiilor intr -o stivă cât mai înaltă, știind că
puteți așeza o cutie doar peste alta ale cărei dimensiuni 2D sunt mai mari.
2. O țeavă de lungime L trebuie să se confecționeze din n bucăți de țeava, fiecare bucată
având lungimea ai. O buca tă de țeavă nu poate fi tăiată. Să se găsească , dacă există, soluția de
a obține țeava de lungime L prin sudarea unor bucăți de țeavă cu lungimea ai.
3. Se dau 12 bile, toate identice ca aspect, din care 11 au aceeași greutate, iar una este
mai grea sau ma i ușoară. Se dă o balanță cu două talere. În trei cântăriri, să se afle care este
bila diferită și dacă este mai grea sau mai ușoară.
4. Având o sumă de 5.109 lei cu care trebuie cumpărate acțiuni la 4 societăți care în
funcție de suma investită asigură pr ofituri conform tabelului de mai jos, să se stabilească o
repartiție optimă a sumelor investite la fiecare societate, astfel încât profitul obținut în urma
aplicării acestei politici de investiții fie maxim. Se cere să se determine repartiția optimă
invest ițiilor în acțiuni la cele 4 societăți, adică acea repartiție care dă profitul total maxim.
Suma investită
(în miliarde de lei) Profitul în procente
S1 S2 S3 S4
0 0 0 0 0
1 0.28 0.25 0.15 0.20
2 0.45 0.41 0.25 0.33
3 0.65 0.55 0.40 0.42
4 0.78 0.65 0.50 0.48
5 0.90 0.75 0.62 0.53

96
c. Nivel olimpiade și concursuri
1. Aurora Flash e conectată la o rețea de bloc cu N calculatoare și M conexiuni
bidirecționale . Fiecare conexiune între două calculatoare x, y are un cost asociat care
reprezintă timpul nece sar informației pentru a parcurge conexiunea respectivă.
Calculatorul 1 este calculatorul Aurorei și calculatorul N este serverul. Aurora s -a saturat de
atâta lag (nu poate juca liniștită Starcraft 2) așa că și -a cumpărat K acceleratoare. Un
accelerator po ate fi instalat pe o anumită conexiune pentru a înjumătăți costul acelei
conexiuni. Dacă pe o conexiune sunt instalate k acceleratoare costul conexiunii scade
de 2k ori. Aurora vrea să instaleze cele K acceleratoare pentru a minimiza timpul necesar
calcula torului ei să comunice cu serverul. Schimbul de informații între două calculatoare se
produce pe drumul de cost minim, ce unește cele două calculatoare. Costul unui drum este
egal cu suma costurilor conexiunilor de pe acel drum. Ajutați -o pe Aurora Flash s ă joace
Starcraft 2.
Fișierul de intrare retea.in va conține pe prima linie numerele N, M și K reprezentând
numărul de calculatoare din rețea, numărul de conexiuni între cele N calculatoare și respectiv,
numărul de acceleratoare cumpărate de Aurora. Următo arele M linii vor conține fiecare câte 3
numere natural x, y și c reprezentând faptul că există o conexiune bidirecțională de cost c
între calculatoarele x și y.
În fișierul de ieșire retea.out veți afișa un singur număr C cu exact 4 zecimale, reprezentând
costul minim al unui drum între calculatoarele 1 și N după instalarea celor K acceleratoare.
Restricții
 1 ≤ N ≤ 1 000
 1 ≤ M ≤ 100 000
 1 ≤ K ≤ 10
 Costul oricărei conexiuni nu va depăși 1 000 000
retea.in retea.out Explicație
5 5 2
1 2 1
2 3 9
3 5 1
1 4 5
4 5 5 4.2500 Aurora instalează ambele acceleratoare pe conexiunea de cost 9 ceea ce
produce un drum de cost 4.25. Dacă ar fi plasat câte un accelerator pe
conexiunile de cost 5 drumul minim ar fi fost egal cu 5.

Vom construi soluția cu programare dinamic ă astfel: Fie C[i][j] costul minim pentru a ajunge în
nodul i cu j acceleratoare folosite. Astfel recurența va fi următoarea:
C[i][j] = min( C[k][j -q] + Cm[i][k]/2q ) unde k este un vecin al lui i (bineînțeles
luăm toți vecinii posibili), q reprezintă câte acceleratoare folosim pe muchia dintre i și k, iar
Cm[i][k] reprezintă costul muchiei dintre i și k. Putem observa ușor că această problemă este o
problemă de drum minim într -un graf în care un nod este reprezentat de perechea (i, j)
reprezentând nodul și respectiv numărul de acceleratoare folosite în drumul de la 1 până la i, iar

97 muchiile grafului inițial se transformă în muchii în graful nou luând în calcul "noua dimensiune" dată
de j, numarul de acceleratoare.
2. Gigel și Ionel joacă un joc. Ei au o grămadă ce conține N obiecte și efectuează mutări
alternativ. Cel care se află la mutare poate să ia din grămadă un număr de obiecte cuprins
între 1 și minim{ K, numarul de obiecte ramase in grămada }. Numărul de obiecte luat la
fiecare mutare se adună la nu marul total de obiecte luate până atunci de jucătorul respectiv.
Câștigă torul jocului este cel care, în momentul în care grămada se golește, deține un număr
par de obiecte (pentru a exista un singur câștigător, numărul inițial de obiecte din grămadă
este i mpar). Gigel este cel care efectuează prima mutare.
Pentru valorile N și K date, determinați cine va câștiga jocul, considerând că atât Gigel, cât și
Ionel, folosesc o strategie optimă.
Prima linie a fișierului de intrare obj.in conține numarul J de jocuri ce vor fi descrise în
continuare. Fiecare din următoarele J linii conține câte două numere întregi, separate printr -un
spațiu: N și K.
În fișierul de ieșire obj.out veți afișa J linii. Pentru fiecare joc descris în fișierul de intrare
(în ordinea în care sunt date în fișier), veți afișa caracterul 'G', în caz că Gigel va câștiga jocul,
respectiv caracterul 'I', în cazul în care câștigătorul este Ionel.
Restricții
 1 ≤ J ≤ 30
 Pentru fiecare joc:
o 1 ≤ N ≤ 1.000.000.000, N impar
o 1 ≤ K ≤ N
obj.in obj.out
5
21 8
23 8
9 3
11 3
999999 12345 I
G
I
G
G
Vom calcula win[0][i] =1, dacă grămada conține i obiecte, câștigătorul trebuie să strângă un
număr par de obiecte, iar jucătorul aflat la mutare are strategie sigură de câștig , sau 0, dacă jucătorul
aflat la mutar e nu are strategie sigură de câștig. win[1][i] va reprezenta același lucru, cu diferența
că cel care câștigă jocul este cel care adună un număr impar de obiecte. Avem win[0][0]=1 și
win[1][0]=0 . Pentru fiecare valoare a lui i de la 1 la N, variem numarul d e obiecte pe care le ia
jucătorul aflat la mutare și, în funcție de paritatea acestui număr , paritatea lui i și paritatea numărului
de obiecte ce trebuie luate pentru a câștiga jocul, se determină stările în care se poate ajunge; ca orice
alt joc rezolvat prin programare dinamica, jucătorul aflat la mutare va avea strategie sigură de câștig
dacă cel puțin una din stările în care poate ajunge este o stare de pierdere pentru jucătorul ce se va afla
la mutare în continuare (adică adversarul).

98 3. Fermierul Ion are o gradină formată din N zone pătratice cu latura de 1 metru, așezate
una după alta, în linie. În fiecare astfel de zona crește câte un morcov magic. Pentru fiecare
morcov este cunoscută valoarea sa energetică. Rila Iepurilă, iepurele buclucaș, a invad at
gradina fermierului și a început să mănânce morcovii. Iepurașul urmează un anumit traseu și
mănâncă integral morcovii din zonele prin care trece. După ce un morcov este mâncat, crește
altul în loc, de aceeași valoare energetică (nu uitați că morcovii su nt magici, iar grădina este
una imaginară). Gradul de satisfacție al lui Rilă este dat de suma valorilor energetice ale
morcovilor pe care îi mănâncă.
Pentru că iepurele este un animal deștept, traseul acestuia are anumite caracteristici. Rilă
începe dintr -o zonă oarecare și execută un număr P de salturi iepurești, astfel încât prin
salturile sale să nu părăsească niciodata grădina. Fermierul, după ce a studiat comportamentul
iepurelui pentru o perioadă lungă de timp, cunoaște acum lungimile celor P salturi ale
iepurelui și știe că acesta execută toate aceste salturi într -o ordine oarecare.
Să se determine gradul de satisfacție maxim pe care îl poate obține iepurele.
Fișierul morcovi.in conține pe prima linie N, numărul de zone ale grădinii. Pe a doua linie
din fișier se găsesc N numere naturale, al i-lea număr de pe această linie indicând valoarea
energetică a morcovilor ce cresc în zona a i-a. Cea de a treia linie din fișier conține numărul P,
numărul de salturi pe care le face iepurele. Ultima linie conțin e P numere naturale, într -o ordine
oarecare, indicând lungimile salturilor iepurelui.
Pe prima linie a fișierului de ieșire morcovi.out se găsește un singur număr natural,
reprezentând gradul maxim de satisfacție ce poate fi obținut de iepurele Rilă în tra seul său prin
grădina fermierului.
Restricții
 2 ≤ N ≤ 1 000
 1 ≤ P ≤ 12
 Valoarea energetică a unui morcov este un număr natural din interval [1, 100 000 000]
 Fiecare lungime din cele P este mai mică decât N
 Un salt din zona x în zona y are lungimea |x-y|
Exemplu
morcovi.in morcovi.out Explicație
7
1 20 3 1 1 40 10
3
1 2 4 71 Iepurele pornește din casuța 4. De acolo execută un salt de lungime
2 spre stânga, până în căsuța cu morcovul de valoare 20. Apoi
execută pe rând salturile de lungime 4 și 1 spre dreap ta, mâncând
și morcovii cu valorile 40 și 10. Gradul de satisfacție este
1+20+40+10 = 71 .
Notăm cu bst[i][j] gradul de satisfacție maxim pe care îl poate obține iepurele, dacă a efectuat
pașii corespunzători biților de 1 ai lui i, și se află în nodul j. Se observă că din bst[i][j] se poate
ajunge în orice bst[i+2poz][j+Pas[poz]] și bst[i+2poz][j-Pas[poz]] , cu poz de la 1
la P, iar al poz-lea bit a lui i este 0. Pentru fiecare stare se alege maximul posibil. Evident rezultatul
va fi maximul de pe linia bst[2P-1].

99 Capitolul IV. Cercul de informatică
1. Cercul de informatică – mijloc de dezvoltare al competențelor de aplicare creativă a
metodelor de programare
Cercul de informatică este promovat de pedagogia modernă ca una din formele complementare
importante a le activității didactice, care are menirea să sprijine aprofundarea și completarea
cunoștințelor membrilor săi.
Activitățile cercurilor de informatică capătă o pondere tot mai mare în formarea elevilor, prin
deprinderile practice pe care și le însușesc.
Între activitatea de la clasă și cea de la cercurile de informatică este necesar să existe o strânsă
interdependentă, activitatea de la clasă fiind suportul pe care se dezvoltă activitatea din cadrul cercului
de informatică , iar activitatea de în cadrul ce rcului de informatică, prin rezultatele sale, contribuie la
evoluția elevului în domeniul informaticii.
Din punct de vedere formativ cercul de informatică modelează aptitudinile elevilor, le
stimulează inițiativa, deprinderile de muncă independentă și spi ritul de cercetare în echipă.
Activitățile desfășurate în cadrul cercului duc la formarea personalității elevilor din perspectivă
științifică și educativă.
Elevii ocupă un alt loc în cadrul cercului de informatică, în procesul instructiv -educativ, ei sun t
cei care își elaborează și își susțin propriile lucrări. Profesorul îi îndrumă, îi ajută să își perfecționeze
lucrările, iar pe elevii care întâmpină dificultăți în finalizarea lor îi ajută să își atingă țintele propuse.
Conform bibliografiei de special itate se identifică două modalități importante în care pot fi
organizate cercurile:
– Prin anunțarea prealabilă a tematicii cercului ;
– Prin stabilirea tematicii după înscrierea elevilor în cerc, împreună, profesorul de comun acord
cu elevii înscriși în cerc.
Este preferată stabilirea tematicii după înscrierea elevilor la cerc, deoarece astfel tematica este mai
apropiată de interesul elevilor. Profesorul o va stabili împreună cu elevii, ținând cont de propunerile lor,
valorificând inițiativele lor. Încrederea e levilor în propriile forțe și în cunoștințele lor va crește.
La începutul activității unui cerc de informatică, profesorul va indica un număr de teme posibile,
profesorul trebuie să specifice bibliografia de la care elevii por sa -și înceapă cercetările, lo curile
posibile în care să -și desfășoare munca de informare sau de cercetare, locuri ca biblioteca școlii sau a
localității respective, laboratorul de informatică, materiale în format electronic, adrese utile de internet
etc.
Profesorul trebuie să valorifi ce toate inițiativele constructive ale elevilor. Înscrierea elevilor se face
pe baza intereselor, opțiunilor și aptitudinilor lor.
După ce a fost constituit cercul, membrii cercului sunt antrenați în pregătirea ședințelor de cerc și
desfășurarea propriu -zisă a acestora.
Lucrările cercurilor de informatică trebuie să se ocupe atât de aspectul teoretic al temei alese,
cât mai ales de aspectul practic.

100 Astfel elevii exersează munca de documentare și de cercetare științifică a unei teme, dar învață să
sesizeze aspectele utile ale cunoștințelor învățate și să le aplice în mod creativ în rezolvarea
problemelor.
2. Metodologia organizării și desfășurării unui cerc
Metodologia de organizare și desfășurare a unui cerc de informatică este bazată pe metodologia
didactic ă de învățare modernă utilizată și la clasă.
Metodele didactice utilizate în cadrul cercului de informatică sunt o continuare a metodelor
didactice utilizate la clasă, dar mai ales cu accent pe participarea activă a elevului la procesul
instructiv -educativ , elevul fiind cel care elaborează și își susține lucrările proprii.
Conform ordinului MECS nr.4624/2015 portofoliul cadrului didactic coordonator al cercului
conține:
a. oferta educațională a cercului;
b. planificarea calendaristică;
c. documentele de pr oiectare didactică;
d. setul de competențe formate prin activitatea desfășurată în cadrul cercului;
e. modalități de evaluare a activității didactice desfășurate în cadrul cercului;
f. măsuri de optimizare și dezvoltare a ofertei educaționale a cercului;
g. proiectul de dotări și achiziții pe termen scurt, mediu și lung, dacă este cazul;
h. portofoliul de studii al elevului, care cuprinde modulele de studio parcurse și competențele
specifice acestora, formate pe parcursul frecventării activității cercului.
Etapele organizării unui cerc
Asigurarea bazei materiale
– amenajarea laboratorului de informatică , dacă este cazul;
– instalarea softului necesar , pe fiecare calculator, pentru o bună desfășurare a activităților
propuse la cerc;
– crearea unui mediu de lucru plăcut .
Organizarea activității cercului de informatică
– prezentarea în unitatea școlară a ofertei activității cercului;
– criterii de vârstă pentru alcătuirea grupelor;
– conceperea activității cercului ca pe o activitate deschisă cerințelor elevilor.
Organizar ea grupelor de elevi
Activitatea de organizare trebuie să fie în favoarea elevilor, flexibilă în funcție de priceperile și
deprinderile elevilor. Se vor organiza grupe mici de 2 -4 elevi avându -se în vedere preferințele lor de a
lucra împreună, dar și apti tudinile și preocupările lor.
Stabilirea tematicii cercului
Profesorul care coordonează activitatea cercului de informatică întocmește planificarea
activităților, luând în considerare mai multe aspect e ce privesc baza materială , cunoașterea nivelului de
cunoștințe a elevilor mergându -se până la amănunte legate de predilecția sau pasiunile unora dintre
elevi încă de la începutul activității în cadrul cercului. Mai exact se va urmări ca tematica cercului:
 să corespundă intereselor membrilor cercului;

101  să abordeze o problemă din sfera școlii;
 să țină seama de baza didactică a școlii și de perspective;
 să îmbunătățească activitatea teoretică și practică a școlii;
3. Strategia didactică utilizată în cadrul cercului
3.1 Strategii didactice
Procesul de învățăm ânt reprezintă principalul subsistem al sistemului de învățământ în cadrul
căruia se realizează activități didactice de predare, învățare și evaluare. Realizarea acestor trei activități
presupune o relație complexă între elev, ca obiect al educației școlar e, și profesor, în calitate de subiect
al modelării personalității primului. Procesul de învățământ presupune mai multe etape care se
desfășoară în timp. În asimilarea materiei, copilul devine subiect cunoscător, iar materia școlară are
semnificația de o biect al cunoașterii.
Predarea, în sens restrâns, "implică ansamblul operațiilor realizate de profesor pentru
proiectarea, realizarea și dezvoltarea mesajelor pedagogice în perspectiva declanșării și a perfecționării
continue a acțiunii de învățare didacti că a elevului , în clasă și în afara clasei. În sens larg, predarea este
interpretată ca acțiune de instruire a profesorului, adresată elevului, pentru stimularea acțiunilor
specifice oricărei activități de învățare."
(Anca Dragu, Sorin Cristea)
Succesul p rofesional al cadrului didactic depinde de stilul de predare, formarea academică și
pregătirea psihopedagogică și metodică.
Învățarea reprezintă o activitate sistematică, dirijată, care are loc într -un cadru organizat, vizând
asimilarea de cunoștințe și formarea structurilor psihice și de personalitate. Rezultatul învățării școlare
trebuie privit sub două aspecte: unul informativ care vizează fixarea informațiilor de către elev și unul
formativ, prin care contribuie la formarea și dezvoltarea personalităț ii elevului acționând asupra
aparatului cognitiv. Psihologul R Gagne distinge două categorii de condiții ce guvernează producerea
învățării: "condițiile interne care țin de particularitățile și disponibilitățile celui care învață și condiții
externe ce p rovin din spec ificul situației de instruire."
Evaluarea reprezintă acțiunea pe care o realizează profesorul în scopul verificării gradului de
îndeplinire a sarcinilor de predare -învățare. Scopul evaluării este reglarea -autoreglarea activității
didactice. Î n funcție de momentul realizării,evaluarea poate fi inițială, continuă, finală.
În funcție de relația stabilită între cele trei acțiuni, putem discuta despre trei tipuri de didactică:
tradițională, modernă, postmodernă. Didactica tradițională, plasată înt re secolele XVII -XIX, concepe
procesul de învățământ doar ca activitate de predare. Profesorul ocupă rolul central, transmițând
informații în vederea memorării și a reproducerii de către elev. Didactica modernă cuprinde perioada
între sfârșitul secolului XIX și prima jumătate a secolului XX și privește procesul de învățământ ca
activitate de predare -învățare. Tot cadrului didactic îi revine locul central, având rolul de a corela
predarea cu învățarea. Didactica postmodernă plasată în cea de -a doua jumătat e a secolului XX -a,
urmărește corelarea celor trei activități, proiectată în sens curricular prin centrarea pe obiective și
realizarea corespondenței pedagogice dintre obiective – conținuturi – metodologie – evaluare.
Reușita sau eșecul acestor trei activ ități didactice este condiționată de strategiile didactice
utilizate de către cadrul didactic la nivelul procesului de învățământ.
Literatura de specialitate oferă o varietate de definiții conceptului de strategie . Potrivit lui Ioan
Cerghit, acestei noți uni i se atribuie mai multe conotații care se întregesc reciproc. "Prin definiție,

102 strategia didactică poate fi privită ca: a) un mod interactiv de abordare și acțiune; b)o structură
procedurală; c)o înlănțuire de decizii; d)o interacțiune optimă între str ategiile de predare și strategiile
de învățare…..În concluzie, sintetizând aceste enunțuri, putem afirma că strategiile didactice reprezintă
un fel de inginerii pedagogice desfășurate ce exprimă voința de traducere a intențiilor instructiv –
educative în acte pedagogice, de a stăpânii situațiile de instruire, de a face față întâmplării sau
hazardului în soluționarea optimă a unor astfel de situații, că sunt construcții alcătuite din acțiunii și
operații, fie predeterminate, fie la inspirația m omentului." P entru Sorin Cristea , strategia didactică
"reprezintă un grup de două sau mai multe metode și procedee integrate într -o structură operațională,
angajată la nivelul activității de predare – învățare – evaluare, pentru realizarea obiectivelor pedagogice
gener ale, specifice și concrete ale acesteia , la parametrii de calitate superioară." Elena Joița definește
strategia didactică ca „ un fapt de management educațional, instrucțional, un șir de decizii rezolutive
pentru sarcina, procesul, situația, problema dată ”. În același studiu, autoarea realizează o grupare a
strategiilor – proceduri , în funcție trei criterii.

Criterii
T
I
P
U
R
I
de
S
T
R
A
T
E
G
I
I

D
I
D
A
C
T După activitatea
dominantă în procesul
instruirii După mecanismele de
prelucrare a i nformațiilor
antrenate în mod
prioritar După obiectivele
predominant cognitive
urmărite
DE PREDARE
– de cunoaștere a stării
inițiale de pregătire, de
asigurare a condițiilor
necesare procesării optime
a informațiilor, de
comunicare și modelare a
informaț iilor, de prezentare
a procedurilor de
prelucrare, de sprijinire –
îndrumare a acțiunilor
cognitive ale elevilor;
De realizare a
mecanismelor abstracte de
procesare a informațiilor:
– de înțelegere, de
categorizare și
conceptualizare;
– de efectuare a
raționamentelor;
– de rezolvare a
problemelor;
– de luare a deciziilor;
De formare -dezvoltare a
deprinderilor, a
priceperilor, a abilităților, a
capacităților, a
competențelor de prelucrare
mentală a informațiilor;

DE ÎNVÃȚARE
– utilizarea procedurilor de
tip algoritmic sau euristic
sau combinat;
– prin activitate
independentă individuală
sau în grup;
– prin îmbinarea
informațiilor dobândite în
mod formal, nonformal sau
informal;
– prin corelarea
experiențelor cognitive
anterioare cu cele noi;
– prin utilizarea tehnicilor
specifice creativității; De prelucrare a
cunoștințelor în memorie:
de stocare, de recuperare în
diferite sisteme mnezice, de
organizare a cunoștințelor
în memorie. De corelare a educației
cognitive cu celelalte
dimensiuni ale dezvoltării
personalității (morale,
estetice, profesionale,
fizice, sociale, religioase,
culturale);

103 I
C
E
DE EVALUARE
– de combinare a evaluării
inițiale, continue și finale.
– de utilizare prioritară a
evaluării formative față de
cea normativă;
– de combinare a
proced urilor de verificare,
de măsurare și apreciere;
– de utilizare a feedback –
ului. De formare a
reprezentărilor. De realizare a obiectivelor
specifice și acționare
derivate din mecanismele
de procesare a
informațiilor;
De prelucrare a
informațiilor la n ivel
concret.
De formare -dezvoltare a
stilurilor cognitive
personalizate;
De însușire a cunoștințelor,
prin mecanismele specifice
prelucrării informațiilor.
A nu se confunda strategia didactică cu metoda didactică. Dacă metoda dida ctică reprezintă do ar o
acțiune ce urmărește eficientizarea învățării în termenii unor rezultate imediate, strategia didactică
reprezintă un model de acțiune cu valoare normativă, care presupune forme de organizare și
desfășurare a activității educaționale, metode și procede e didactice, mijloace de învățământ, și resurse
de optimizare a activității. Strategia didactică reprezintă o formă specifică și superioară a normativității
pedagogice care asigură reglarea unui întreg proces și nu doar a unei secvențe de învățare. Strateg ia
didactică ocupă un loc central în cadrul activității didactice, deoarece proiectarea și organizarea lecției
se realizează în funcție de decizia strategică a profesorului.
În lucrarea " Tehnici de programare pentru probleme de optimizare ", am folosit conc eptul de
strategie didactică ca fiind ansamblu polivalent și logic de mijloace, metode, materiale și alte resurse
educaționale ce urmărește însușirea unor competențe . În cercetarea efectuată, am avut în vedere cele
două tipuri majore de strategii didactice : tradiționale și moderne.
3.1.1. Metoda didactică
Noțiunea de metodă, etimologic vorbind, provine din grecescul metha (spre) și odos (cale,
drum), însemnând, cale, drum de urmat în vederea atingerii unui anumit scop, rezultat. La nivelul
cunoașterii comu ne ar putea fi gândită ca o manieră concretă de lucru.
Caracteristicile ei principale sunt finalitatea (ea urmărește întotdeauna realizarea unui scop, a
unui obiectiv), caracterul conștient, normativitatea (ne arată "cum să facem", cum să acționăm pentru a
ne atinge scopul propus), caracterul instrumental (este o modalitate practică de informare, interpretare,
acțiune).
În literatura de specialitate, metoda cunoaște o multitudine de accepțiuni. Pentru Sorin Cristea
"metoda didactică/ de învățământ reprezin tă un ansamblu de procedee și mijloace integrate la nivelul
unor acțiuni implicate în realizarea obiectivelor pedagogice concrete ale activității de instruire/ educație
proiectată de educatoare, învățător, profesor." Pentru Ioan Cerghit metoda este " știință pentru că cere
un efort de elaborare științifică…, este tehnică întrucât este purtătoarea acțiunii didactice și educative,
servind nemijlocit praxisul pedagogic….., și este artă pentru că are o mare putere de adaptabilitate la
situația în care este implicată (măiestrie pedagogica)."

104 Potrivit lui Ioan Cerghit, metodele îndeplinesc următoarele funcții:
a. funcția cognitivă – "metoda constituie pentru elev o cale de acces la cunoașterea adevărurilor și a
procedurilor de acțiune, la însușirea științei și tehnicii , a culturii și a comportamentelor umane";
b. funcția formativ -educativă – "metodele supun solicitării, exersării și dezvoltării diversele funcții
psihice și motorii ale elevilor" determinând schimbări în conștiința și conduita acestora;
c. funcția moti vațională – metoda poate face "mai atractivă activitatea de învățare, să suscite
curiozitatea epitemică și mai mult interes față de ceea ce se învață, să amplifice satisfacțiile și să
susțină pasiunile";
d. funcția instrumentală/operațională – "metodele se si tuează ca intermediar între obiective și
rezultate…., devenind mijloace de obți nere a rezultatelor așteptate";
e. funcția normativă, de optimizare a acțiunii – metoda "arată cum anume trebuie să se procedeze,
cum să se predea și cum să se învețe, cum să înv ățăm pe alții să învețe";
Metoda de învățământ poate fi apreciată, din perspectiva elevului ca o metodă de învățare, iar din
perspectiva profesorului/ institutorului ca o metodă de predare, redând unitatea organică a predării și
învățării. Este o modalitat e de activitate comună profesor -elev, prin care elevul își însușește atitudini,
capacități, competențe, deprinderi și cunoștințe, iar profesorul își exercită și își perfecționează
capacitatea de influențare a elevilor, în perspectiva unor scopuri. Metodolo gia vizează modul în care se
construiește cunoașterea /învățarea și nu conținutul concret al cunoașterii/ învățării. În esență, metodele
de predare -învățare, metode de instruire, ori metodele de predare – învățare – evaluare , în sens
curricular, pot fi cons iderate modalități practice de utilizare a mijloacelor didactice.
Trecând în revistă principalele accepțiuni ale noțiunii de metodă, Irina Maciuc ajunge la
concluzia că:
"- în sens cibernetic , metoda este o tehnică de acțiune care conține elemente de
progr amare a operațiilor și comportamentelor, elemente de comandă și de retroacțiune;
presupune dirijarea activității de către profesor/institutor, control operativ al rezultatelor
și, de asemenea, ameliorări, corectări, ajustări;
– în sens praxiologic , metoda este o tehnică de execuție în vederea îndeplinirii unor
scopuri/obiective, modalitate a acțiunii complexe, un fel anume de a acționa, o
modalitate practică de acțiune;
– funcțional și structural , metoda poate fi considerată un ansamblu organizat de
procede e corespunzând operațiilor de efectuat pentru a se ajunge la realizarea unor
anumite obiective.
– în sens constructivist , metoda presupune construcția cunoașterii/ învățării la elev."
Este necesară o clasificare a metodelor didactice. Varietatea criteriilo r și amplificarea numărului
de metode fac dificilă această clasificare. Chiar Ioan Cerghit remarca dificultatea și relativitatea
clasificării, căci nicio clasificare „nu va fi nici definitivă, nici destul de completă”. Potrivit lui,
principala dificultate nu este operația de clasificare propriu -zisă, ci găsirea criteriului celui mai adecvat
pe baza căruia s -ar realiza structurarea dorită. Ioan Cerghit ajunge la o clasificare cvadripartită care
oferă o viziune de ansamblu și unitară asupra posibilităților metodologice ce stau la îndemâna
profesorului.

105
Metode de învățământ
(după Ioan Cerghit)
I. Metode de comunicare orală
a. metode expozitive/ afirmative : povestirea, descrierea, explicația, prelegerea școlară,
demonstrația, expunerea cu oponent, prelegerea -discuție;
b. Metode interogative (conversative sau dialogate)
– conversația euristică;
– conversația de aprofundare;
– conversația de consolidare;
– conversația de verificare;
– discuția -dialog (elev -profesor);
– consultația în grup;
– discuția obișnuită de grup;
– masa -rotundă;
– asaltul de idei/brainstormingul;
– discuția dirijată;
– discuția liberă;
– metoda problematizării
– metoda acvariului sau a interacțiunii observate (fishbowl)
– metoda mozaicului (jigsaw)
– metoda cubului.
II. Metode de comunicare scrisă
– metoda studiului individual
III. Metode de explorare a realității/metode intuitive
a. Metode de explorare nemijlocită (directă) a realității
– observația sistematică și independentă;
– experimentul;
– învăța rea prin cercetarea documentelor ;
b. Metode de explorare mijlocită (indirectă ) a realității
– demonstrația
– modelarea
– metoda studiului de caz
IV. Metode de învățare prin acțiunea practică (operaționale sau practice)
a. metode bazate pe acțiunea reală
– exercițiul;
– proiectul sau tema de cercetare -acțiune;
– lucrarea practică;
b. metode de simulare (bazate pe acțiunea fictivă)
– jocul;
– învățarea pe simulatoare;

106 V. Metode de raționalizare a învățării și predării
– algoritmizarea;
– activitatea cu fișe;
– instruirea programată;
– învățarea asistată de calculator (IAC).
– Învățarea electro nică (e -learning)
Selecția realizată de către Ioan Cerghit este mai amplă. În realizarea schemei de mai sus am
selectat doar acele metode care se pliază pe activitățile desfășurate în cadrul cercului de informatică .
În general, în cadrul orei de informatic ă, la nivel liceal, se utilizează, metode precum dezbaterea,
exercițiul, învățarea prin descoperire, discuția, problematizarea , conversația, studiul de caz.
Modalitatea de îmbinare a acestor metode ține de abilitățile profesorului. Acesta trebuie să aibă d rept
scop atingerea cât mai bine a obiectivelor vizate de lecție.
3.1.2 Procedee didactice
Procedeul didactic poate fi definit ca element de detaliu, secvență a metodei, particularizare a
acesteia, componentă a ei. El corespunde unei operații de efectuat î n cadrul aplicării metodei.
Combinarea procedeelor, calitatea și natura lor, funcționalitatea lor în ansamblul utilizării unei metode
de învățământ determină în modul cel mai direct eficiența metodei.
Sorin Cristea definește procedeele didactice ca fiind " operații subordonate acțiunii declanșate la
nivelul metodei de instruire propusă de profesor și adoptată de elev. Ele includ tehnici mai limitate de
acțiune care contribuie la practicarea unei metode, în diferite condiții și situații concrete." Definirea
operațională a conceptului evidențiază faptul că procedeul constituie o componentă sau o
particularizare a metodei , care condiționează, din interior sau din exterior, calitatea acesteia. Din
interior, prin capacitatea de reordonare a operațiilor în cadrul acțiunii declanșate la nivelul metodei; din
exterior, prin prelucrarea unor responsabilități ale metodei când are loc un blocaj pedagogic.
Relația procedeu -metodă didactică angajează un ansamblu de interacțiuni de mare mobilitate
operațională, dependentă de evoluția concretă a activității de predare – învatare – evaluare . Astfel, o
metoda poate deveni imediat procedeu, la fel cum un procedeu poate fi convertit în metoda atunci când
desfășurarea acțiunii didactice o impune. Practic fiecare metodă are capaci tatea de convertire rapidă a
statutului său funcțional, la nivelul unui procedeu didactic cu resurse operaționale active în interiorul
acțiunii declanșate . Asemenea resurse sunt evidente mai ales în cazul următoarelor metode:
conversația, munca cu manualul , reflecția, observarea, demonstrația, lucrările practice, jocul, instruirea
asistată pe calculator.
În cadrul parcurgerii temelor propuse la cercul de informatică , pot fi folosite următoarele tehnici
de comunicare didactică:
 Tehnica "Lasă -mă pe mine să am ultimul cuvânt;
 Cadranele;
 Gândiți/ Lucrați în perechi/ Comunicați;
 Știu, vreau să știu, am învățat;
 Ciorchinele;
 Pălăriile gânditoare;
 Turul galeriei;
 Tehnica 6/3/5 (brainwriting)
 Ghidul de anticipație;
 Cubul;
 Mozaicul;

107  Linia valorilor;
 Frisco;
 Unul stă, ceilalți circulă;
 Turneul între echipe;
 Graffiti;
 Puzzle sau Jigsaw;
 Phillips 6 -6;
 Acvariul;
 Diagrama Venn;
 Blazonul;
În perspectivă curriculară, fiecare metodă – fiind concepută ca metoda de predare – învățare –
evaluare – presupune și procedee de evalua re. Aceste procedee – tratate altfel ca strategii didactice
stimulative sunt integrabile la nivelul oricărei metode, cu anumite predispoziții de natură tehnologică:
– chest ionarea orală este un procedeu folosit la nivelul întregului sistem al metodelor, ma i ales
în cadrul conversației euristice;
– lucrările scrise/de control reprezintă un procedeu didactic aplicabil mai ales în cazul metodei
demonstrației, metodei algoritmizării , metodei problematizării;
– lucrarea practică este un procedeu didactic util m ai ales în cadrul metodei observației, metodei
experimentului;
– testul docimologic reprezintă un procedeu didactic cu rol în evaluarea întregului sistem de
învățământ.
3.1.3. Mijloacele de învățământ
Mijloacele de învățământ constituie totalitatea instru mentelor naturale, tehnice, materiale alese
și aplicate la nivelul metodelor și procedeelor de învățământ în vederea realizării eficiente a sarcinilor
proiectate la nivelul activității de predare – învățare – evaluare. Acestea au un rol de comunicare
deoar ece facilitează transmiterea unor informații și asimilarea lor de către elevi, dar și o funcție
formativ -educativă fiindcă îi obișnuiește pe elevi cu selectarea și utilizarea instrumente esențiale în
procesul de cunoaștere. Au și o funcție stimulativă deo arece cu cât este mai atractivă, cu atât îi
motivează mai mult pe elevi.
Modernizarea tehnică a mijloacelor didactice creează premisa optimizării metodelor de predare
– învățare – evaluare. Sunt preferate astăzi mijloacele tehnice audio -vizuale, care st ochează informații
sub forme variate și care au un efect puternic de stimulare a activității de învățare, datorită caracterului
sugestiv al imaginilor și celui realist și expresiv al informațiilor.
Elementele care asigură valoarea psihopedagogică a oricăru i mijloc de învățământ, adaptate
după R. Glaser (1972) sunt:
 "Nivelul motivației școlare a elevilor și configurația sistemului lor cognitiv, cunoștințele și
competențele necesare asimilării noului;
 Inteligența generală a elevilor și capacitatea lor de învă țare;
 Modalitatea de proiectare, structurare și sistematizare a programelor de învățare, relevanța
și logica informațiilor care vor fi dobândite;
 Caracterul activ și complementar al activității de predare – învățare;
 Verificarea/controlarea activității min tale a elevilor, asigurarea feed -backului, a repetiției și
a exersării."

108 În alegerea mijloacelor de învățământ, trebuie ținut cont și de descoperirile lui Roger Muchielli
(1982), care demonstrează că "la sfârșitul unei secvențe de învățare, în condițiile u nei atenții voluntare
și cu un grad sporit de concentrare, elevul reține diferențiat: 10% din ceea ce citește, 20% din ceea ce
aude, 30% din ceea ce vede, 50% din ceea ce vede și aude în același timp, 80% din ceea ce spune și
90% din ceea ce spune și face în același timp. "
Selectarea mijloacelor de învățământ și includerea lor în scenariul didactic nu se face aleatoriu,
ci depinde de factori multipli: natura conținutului și a obiectivelor urmărite, vârsta elevilor,nivelul lor
de intelect, resursa de timp. Eficiența utilizării lor este asigurată de maniera în care acestea sunt
integrate în activitatea didactică, iar aceasta ține în principal de inspirația și experiența profesorului.
În cadrul cercului de informatică , predarea și învățarea se realizează făcâ nd apel la suportul
aplicativ al mijloacelor de învățământ. Se folosește aplicația vizuală propusă , fișele de lucru, mijloacele
tehnice audio -vizuale, pent ru a rula scurte filme, imagini și softul necesar pentru rularea aplicațiilor .
Elevii manifestă un in teres deosebit pentru partea practică, prin interacțiunea cu calculatorul aceștia pot
vizualiza rezultatele problemelor . Eficiența metodelor de instruire depinde de creativitatea profesorului
care poate obține rezultate deosebite folosind doar mijloace did actice clasice de tipul tablă, manual,
planșe. Trebuie evitate rutina, formalismul sau excesele. În utilizarea mijloacelor didactice se impune
alegerea, combinarea, dozarea și integrarea cu grijă în procesul didactic, pentru a risipi atenția elevilor
și a diminua astfel funcționalitatea lor instructiv -educativă. Nu este recomandată folosirea unui singur
mijloc de învățământ, deoarece, din cauza rutinei, elevul își poate pierde interesul. Suporturile
materiale trebuie alternate și conjugate, întotdeauna sub ordonate obiectivelor urmărite în cadrul unei
activități de învățare astfel încât să stârnească constant interesul elevilor. Un mijloc de învățământ nu
este eficient în sine, ci numai ca element component al unui sistem de mijloace de învățământ, care se
sprijină reciproc și care se integrează într -o strategie de instruire coerentă.
3.1.4. Moduri de organizare a activității didactice
În funcție de tipul de organizare a activității didactice s -au identificat trei moduri de activități :
• activități frontale,
• activități de grup
• activități individuale
În funcție de metodele și procedeele didactice folosite, se impune și un anumit mod de organizare a
activității didactice. Comparând cele trei forme de organizare, sesizăm faptul că fiecăreia îi corespund
atât avantaje, cât și dezavantaje.
Organizarea frontală a activității elevilor presupune ghidarea și verificarea activității întregii clase, în
același timp , într -un anumit interval și de obiective le educaționale comune. Profesorul, în mod frontal,
transmite informații, explică, demonstrează, argumentează, formulează întrebări, dirijează activitatea
tuturor elevilor , iar elevii rezolvă, simultan ș i în același ritm, sarcinile de instruire comunicate de
profesor sau se autoinstruiesc.
Avantajele învățământului f rontal sunt de natură:
 Socială= este economică și relevantă din punct de vedere moral;
 Pedagogică= are ca scop însușirea cunoștințelor fundamentale;
 Metodică = sub această formă, activitatea profesorului este cea mai productivă.
Învățământul frontal prezi ntă și o serie de limite precum imposibilitatea participării tuturor elevilor la
activitatea didactică. Această limitare se datorează caracterului magistrocentrist și dirijist al predării –
învățării Depășirea acestui inconvenient presupune alternarea organ izării frontale, individuale sau pe
grupe în cadrul aceleiași activități didactice.

109 În organizarea activității frontale din sala de clasă trebuie să se țină seama de următoarele aspecte:
 Profesorul trebuie să se afle în fața clasei pentru a avea un contro l asupra întregii clase;
 Profesorul trebuie să se deplaseze prin clasă pentru a evite unghiurile moarte;
 Dacă este aleasă metoda prelegerii sau expunerii, trebui intercalate scurte întrebări
frontale prin care se verifică atenția elevilor.
Activități în ca re se folosește organizarea frontală pot fi: lecția , seminarul, cursul universitar .
Organizarea pe grupe a activității elevilor constă în faptul că profesorul coodonează activitatea
grupelor formate din elevii unei clase, vizează atingerea unor obiective fie identice , fie diferite de la o
grupă la alta.
De obicei grupele sunt formate din 3 -8 elevi și pot fi :
 omogene – subdiviziuni formale, formate după c riterii bine stabilite anterior, cu o
organizare exactă (elevi cu același stadiu de pregătire la respec tiva disciplină , cu aceleași
nevoi educaționale, sau aceleași motivații)
 neomogene/ eterogene – subdiviziuni informale, alcătuite în mod spontan după
preferințele elevilor care își desemnează singuri un coordonator.
 organizarea în binom – elevii lucrează în perechi.
Activitățile în care putem folosi organizarea pe grupe pot fi: consultații/meditații dirijate,
sesiuni de comunicări științifice, dezbateri, vizite cu scop de documentare științifică -pedagogică.
Grupul permite elevului să se autodescopere și în același timp să ajungă să îi perceapă și pe
ceilalți. Ideal ar fi ca întreaga clasă să formeze un singur grup care să colaboreze și să se ajute în
vederea atingerii finalităților.
Organizarea individuală a activității didactice pune accentul pe munca independentă, fără
supraveghere directă și consultantă din partea profesorului. Acest tip de activitate își găsește explicația
în psihologie, sociologie si pedagogie. Din punct de vedere psihologic, învățarea este individuală și
independentă. Chiar și la nivel de clasă învățarea este individuală deoarece fiecare elev are un bagaj
propriu de cunoștințe și un ritm diferit de învățare în funcție de interesul manifestat pentru o disciplină
anume. Din punct de vedere sociologic se remarcă o tendință a afirmări i de sine. Din punct de vedere
pedagogic , învățământul evoluează spre îmbinarea teoreticului cu practicul, prin care se insistă asupra
rezultatelor practice ale elevului.
Creșterea cerințelor de învățare continuă (educație permanentă) și de autoinstruire , fac necesară
deprinderea elevilor cu studiul independent și intensificarea acestei modalități de lucru.
Profesorul trebuie să organizeze activitățile didactice în așa fel încât să crească șansele de succes
în atingerea obiectivelor propuse, stabilind o diversitate de activități în funcție de potențialul elevilor
săi. Astfel, activitatea frontală este eficientă în procesul de însușire a elementelor de bază, a noțiunilor
fundamentale și a tehnicilor de muncă intelectuală. Învățământul individual și pe grupe este recomandat
în mod special în etapa de fixare și consolidare a cunoștințelor dobândite în urma activității desfășurate
concomitent cu întreaga clasă.

110 4. Cercetarea pedagogică – „Tehnici de programare pentru probleme de optimizare”
în cadrul cercului de informatică
4.1. Etapele proiectării
Cercul de informatică ,,Tehnici de programare pentru probleme de optimizare ” a avut ca scop
aprofundarea și modelarea aptitudinilor elevilor, stimulând interesul acestora pentru disciplina
Informatică.
Cercul de in formatică are scopul de a stimula curiozitatea științifică, spiritual de observație și de
investigație, pasiunea pentru descoperire, adaptarea la lucrul în echipă, socializarea cu elevii din
aceeași grupă și de a dezvolta deprinderi de utilizare a diferite lor tehnici de programare.
În alegerea denumirii cercului s-a avut în vedere ca acesta să fie incitant, să stârnească interesul
elevilor și mai ales să -i motiveze în a participa activ pe toată durata desfășurării cursului. Titlul ales nu
este foarte expli cit, scopul vizat fiind acela de a -i face pe elevi curioși să descopere pe parcurs
conținuturile vizate.
Strategia didactică a constat în utilizarea unor metode didactice active, centrate pe elev :
dezbaterea, învățarea prin descoperire și cooperare, expli cația, problematizarea, expunerea, exercițiul,
dezbaterea . Dintre p rocedeele didactice aplicabile la disciplina Informatică au fost utilizate: cubul,
pălăriile gânditoa re, gândiți/lucrați în perechi/ comunicați, ciorchinele, harta conceptuală, turul galerie i,
mozaicul, tehnica acvariului . Au fost folosite trei moduri de organizare a activității didactice: frontală,
pe grupe și individuală.
Cursul a vizat elevi din clasele a X -a și a XI-a, cu profil real. Cercul a fost proiectat pe zece
ședințe, cu durata de două ore/ ședință . Resursa de timp presupune studierea algoritmilor și a structurilor
de date înainte de începerea cursului, deoarece, fiind vorba despre tehnici de programare, elevii trebuie
să cunoască elementele de bază ale limbajului, instrucțiunile și tipurile de date . Resursele materiale au
fost fișele de lucru individual, calculatorul , caietul, tabla, videoproiectorul și o aplicație didactică
realizată în urma cercetării științifice din capitolul doi .
Respectiva aplicație este gândită ca un suport de curs pe care elevii o vor putea accesa de pe
fiecare calculator, în timpul ședințelor de cerc și nu numai.
Activitatea profesorului a urmărit secvențele didactice: captarea atenției se realizează prin
anunțarea introducerii în studiul unor tehnici de o ptimizare , a căror metodă de rezolvare este familiară
prin raportare a la alte aplicații deja studiate la clasă , precum sortare de vectori ; enunțarea temei și a
competențelor, prin comunicarea acestora , a secvențelor scenariului didactic, a sarcinilor de lu cru.
Dirijarea învățării a avut în vedere:
 relevarea particularităților acestor tehnici de programare și diferențierea lor de celelalte
tehnici învățate la clasă ;
 stabilirea temei fiecăruia și a tematic ii comune ;
 identificarea tehnicilor utilizate pentru r ezolvarea diferitelor probleme și caracterizarea
acestora pe baza unor mijloace diferite;
 identificarea unor asemănări și deosebiri între cele două tehnici propuse ;
 identificarea avantajelor și dezavantajelor în alegerea uneia dintre tehnici ;
 identificarea structurilor de date ce intră în conceperea rezolvării unei probleme ;
 dezbaterea asupra unei rezolvări propuse ;
 identificarea elementelor specifice fiecărei tehnici de programare .

111 Activitatea elevilor a constat în fixarea noț iunilor teoretice pe baza fișelor de documentație,
exemplificarea pe algoritm pentru anumite date de intrare și identificarea datelor de ieșire , testarea și
rularea programelor realizate .
La începutul cursului a avut loc și o evaluare inițială vizând cunoștințele despre descrierea
corectă a unui algoritm, declararea corectă a variabilelor, lucrul cu fișiere și respectarea condiției pentru
determinarea valorilor cerute . Evaluarea sumativă a constat în pregătirea unui studiu de caz și a unui
proiect, la finalul studierii ambelor tehnici de programare , prima parte vizând tehnica Greedy , iar a
doua tehnica programării dinamice .
Feedback -ul activității , prin performanțele elevilor, a reliefat o serie de aspecte pozitive, printre
care:
 deschiderea elevilor pentru nou și dorința de descifrar ea unor probleme ce nu fac parte
din programa de Bacalaureat, ceea ce presupune dezvoltarea capacităților de scriere,
implementare și testare a unui algoritm ;
 curiozitatea și atracția față d e cunoașterea datelor ce intervin în abordarea uneia dintre
tehni cile de programare propuse ;
 abilitățile lor comunicative, argumentative și plăcerea pentru dezbateri;
 la finalul fiecărei ședințe , prin schemele realizate, elevii au demonstrat capacitatea lor de
analiză, sinteză și generalizare;
 elevii au fost capabili s ă discute, în urma acestor ore, și asupra aspectelor legate de
avantajele și dezavantajele utilizării uneia dintre cele doua tehnici studiate ;
 elevii și -au exprimat dorința de a frecventa un alt curs opțional care să nu fie îngrădit de
programele școlar e. Opțiunea lor a fost către programare orientată pe obiecte.
Scopul cercului de informatică este de dezvoltare a competențelor de utilizare a metodelor și
tehnicilor de programare . S-a urmărit atât înțelegerea tehnicilor , cât și manevrarea datelor de intrar e
pentru obținerea datelor de ieșire . Alături de probleme clasice specifice fiecărei tehnici de programare,
supuse analizei, au fost folosite și probleme propuse la olimpiade și concursuri . Punctul de plecare în
elaborarea programei cercului a fost Program a Națională de Informatică intensiv pentru liceu, mai
exact, programa pentru clasa a -XI-a.

112 Programa cercului de informatică : “Tehnici de programare pentru problem de optimizare ”
Argument
În ultimii ani asistăm la o dezvoltare în ritm susținut a utilizării calculatoarelor, spectrul
aplicațiilor în diferite domenii de activitate se îmbogățește continuu, numărul utilizatorilor se mărește
simțitor.
Odată cu creșterea complexității programelor este necesară însușirea modului de programare pe
calculator.
Analiza t cu mare atenție, documentul care stabilește ariile curriculare și obiectele de studiu,
scoate în evidență faptul că “nevoia de a regândi mijloacele educației în contextul societății bazate pe
libertăți, pe beneficiul informației pe scară mare și informat izare, este o necesitate și o prioritate în
același timp pentru școala noastră.” (O.M. 3139/19.01.1998).
Studiul și participarea la activitățile extrașcolare din cadrul cercurilor are un rol foarte important
în întregirea activității curente din cadrul șco lilor și nu numai.
Activitatea din cadrul cercului de Informatică are ca principal obiectiv să stimuleze c apacitatea
elevilor de a utiliza tehnici clasice de programare, să formeze priceperi și deprinderi specifice acestei
materii, bazându -se pe o programă adaptată local, la nivelul grupei și a dotărilor cercului.
Prin studiul materiei Informatică ne propunem să stimulăm dorința elevilor de a învăța și de a se
acomoda cu transformările ce au loc în domeniul prelucrării și transmiterii informației cu mijloac e
moderne și de a se familiariza cu tehnicile de programare.
Scopul cercului de informatică este de a -i ajuta pe elevi să descopere că informatica nu se
limitează la memorarea unor algoritmi și la rezolvarea unor probleme pentru bacalaureat sau atestat.
Această formă de activitate poate duce la performanță deoarece pune în prim plan elevul. Prin cercul de
informatică se dezvoltă atât competențe de elaborare a algoritmilor cât și de implementare a acestora
într-un limbaj de programare. La nivelul cercului de informatică se pot aplica diverse metode în
vederea identificării metodei de programare adecvate pentru rezolvarea problemei. În prim -plan va fi
elevul care ajutat de profesor, prin aplicarea unor metode interactive, va ajunge să analizeze comparativ
eficiența diferitelor metode de rezolvare a aceleiași probleme și alegerea celui mai eficient algoritm de
rezolvare.
COMPETENȚE GENERALE
1. Identificarea datelor care intervin într -o problemă și aplicarea algoritmilor fundamentali de
prelucrare a acestora
2. Elabora rea algoritmilor de rezolvare a problemelor
3. Implementarea algoritmilor într -un limbaj de programare
VALORI ȘI ATITUDINI
 Exprimarea unui mod de gândire creativ, în structurarea și rezolvarea problemelor
 Conștientizarea impactului social, economic și moral a l informaticii
 Formarea obișnuințelor de a recurge la concepte și metode informatice de tip algoritmic
specifice în abordarea unei varietăți de probleme.
 Manifestarea unor atitudini favorabile față de știință și de cunoaștere în general
 Manifestarea iniția tivei și disponibilității de a aborda sarcini variate

113 COMPETENȚE SPECIFICE
1.1 Evidențierea necesității structurării datelor
1.2 Analizarea unei probleme în scopul identificării datelor necesare și alegerea modalităților
adecvate de structurare a datelor care intervin într -o problemă
1.3 Aplicarea în mod creativ a algoritmilor fundamentali în rezolvarea unor probleme concrete
1.4 Descrierea unor algoritmi simpli de verificare a unor proprietăți specifice
1.5 Analizarea în mod comparativ a avantajelor util izării diferitelor metode de structurare a datelor
necesare pentru rezolvarea unei probleme
2.1 Analiza problemei în scopul identificării metodei de programare adecvate pentru
rezolvarea problemei
2.2 Aplicarea creativă a metodelor de programare pentru rez olvarea unor probleme
intradisciplinare sau interdisciplinare, sau a unor probleme cu aplicabilitate practică
2.3 Analizarea comparativă a eficienței diferitelor metode de rezolvare a aceleiași probleme
și alegerea celui mai eficient algoritm de rezolvare a unei probleme
3.1 Utilizarea corectă a subprogramelor predefinite și a celor definite de utilizator
3.2. Construirea unor subprograme pentru rezolvarea subproblemelor unei probleme
3.3. Aplicarea mecanismului recursivității prin crearea unor subprogram e recursive (definite
de utilizator)
COMPETENȚELE DERIVATE ALE CERCULUI DE INFORMATICĂ
1) Cunoașterea terminologiei specifice referitoare la conceptele specifice informaticii;
2) Aprofundarea deprinderilor practice de compilare și rulare a unui program;
3) Culeger ea de date, interpretarea și organizarea lor în structuri logice;
4) Dezvoltarea spiritului de echipă și a abilităților de investigare
5) Aprofundarea în activitatea de documentare și de realizare de referate științifice
6) Interpretarea rezultatelor obținute pe ba za conținuturilor abordate;
7) Realizarea unui program pe o temă dată;
8) Evaluarea tehnicilor abordate și fixarea avantajelor și a dezavantajelor utilizării lor.

114 Unitatea: Liceul Teoretic “G.Călinescu”
Profesor: Marin Mădălina
Disciplina : Cerc Informatică
Anul școlar: 2017/2018
Grupe: Avansați
Nr. ore: 20h (2h x 10 săpt.)

PLANIFICARE CALENDARISTICĂ

Unități de învățare Conținuturi Competențe
specifice Nr.
ore Săpt. Obs.
1. Să ne amintim
 Organizarea grupelor
 Prezentarea calculatoarelor din
dotare
 Test iniți al
 Tema1: Noțiuni generale –
Optimizare
1.1
1.2
1.3

1.4 2h S1

2. Metoda Greedy  Tema2: Descrierea metodei.
Exemplificare problema
fracționară a rucsacului 2.1
2.2
3.1 2h

2h
2h
2h S2

S3
S4
S5
 Tema3: Problema spectacolelor
 Tema4: Reactivi
 Tema5: Prezentarea proiectului
3. Metoda
Programării
Dinamice  Tema6: Descrierea metodei.
Exemplificare problema
discret ă a rucsacului 2.1
2.2
3.1
3.2
3.3 2h

2h
2h
2h S6

S7
S8
S9
 Tema7: Pachete
 Tema8: Tren
 Tema9: Prezentarea pro iectului
Evaluare  Tema 10: Concluzii 2.3 2h S10

115 Proiectul unității de învățare
UNITATEA DE ÎNVĂȚARE – TEHNICI DE PROGRAMARE PENTRU PROBLEME DE OPTIMIZARE
NR. DE ORE ALOCATE – 16 ore

CONȚINUTURI Competențe
specifice ACTIVITĂȚI DE
ÎNVAȚARE NR.
ORE RESURSE EVALUARE
Metoda de
programare Greedy 2.1
2.2
3.1  Metoda greedy; Descrierea
metodei
 Implementarea metodei
 Realizarea de aplicații,
individual și în echipă
 Analizarea codului unui
program în scopul
identificării modului de
realizare a funcționalit ății
acestuia
 Modificarea codului
pentru a obține alte efecte și
analiza comparativă a
efectelor obținute printr un
schimb liber de idei 8h Materiale:
Calculator
Videoproiector
Fișe de documentare
Aplicații on -line
Code Blocks
Metode, strategii
didactice:
Conversația: frontală,
individuală, recapitulativă
dezvoltată și expozitivă,
explicația, descoperirea,
Aplicații pe calculator
Forme de organizare:
Activitate frontală,
individual, pe grupe
Activitate practică în echipă
Elevii să demonstreze că sunt capab ili să rezolve
o problemă dată folosind metoda cerută prin
realizarea de aplicații practice
 probe orale
 probe practice
 observare sistematica

Metoda
programării
dinamice 2.1
2.2
3.1
3.2
3.3  Metoda programării
dinamice; Descrierea metodei
 Implementarea metodei
programării dinamice
 Analizarea codului unui
program în scopul
identificării modului de
realizare a funcționalității
acestuia
 Compararea metodelor de
construire a algoritmilor 8h

116 4.2. Des crierea unor secvențe de lecție
TEMA 1
Conținut: Noțiuni generale – Optimizare
Metode didactice: învățarea prin descoperire , brainstorming -ul, conversația catihetică,
problematizarea, explicația,
Tehnică de comunicare : Gândiți – Lucrați în perechi – Comunicați, ciorchinele
Mijloace de învățământ: fișe de lucr u, table, calculator cu acces la internet
Forme de organizare a instruirii: independentă, pe grupe, frontală
Cadrul didactic amintește de titlul cercului de informatică și pune accent pe termenul de optimizare .
Colectivul cercului este organizat în trei g rupe a câte trei sau patru elevi. Profesorul le cere să caute
informații pe Internet despre termenul “Optimizare”, lăsându -le timp de studiu aproximativ 15 minute.
Fiecare grupă va desemna câte un reprezentant care să prezinte trăsăturile generale ale term enului. Pe
baza răspunsurilor elevilor, verificate prin activitate frontală. La final, profesorul sintetizează pe tablă
informația, folosind tehnica ciorchinelui.

Optimizare “Cel mai bun” Criteriu
Soluție
Algoritm Metodă Matematică
Date
Selective
Minim/maxim Decizie Restricție

117 TEMA 2
Conținut: Descrierea metodei Greedy. Exemplificare problema fracționară a rucsacului
Metode didactice: învățarea prin cooperare, reflecția, conversația
Tehnică de comunicare: mozaic
Mijloace de învățământ: fișe de lucru
Forme de organizare a instruirii: independentă individuală, pe grupe, frontală
Profesorul dist ribuie fiecărui elev o fișă de documentare referitoare la tehnica Greedy, aceasta este
împărțită în trei secțiuni: descrierea metodei, implementarea metodei Greedy în problema fracționară a
rucsacului și codul C++ al pr oblemei.
Cadrul didactic îi familiari zează pe elevi cu subiectul pe care urmează să îl studieze, și
implementarea metodei Greedy pentru rezolvarea problemelor de optimizare. Textul oferit spre studiu
este fragmentat în 3 părți numerotate, iar colectivul este organizat pe 3 grupe a câte 3 elev i (grupuri „de
baștină”). Fiecare elev din grupele realizate poartă un număr de ordine (de la 1 la 3), corespunzător
secțiunii pe care trebuie să o studieze.
Fiecare elev trebuie să studieze în liniște, individual, doar secțiunea care îi revine. Pentru
această sarcină de lucru se folosește tehnica lecturii lente, în liniște astfel încât elevul să ajungă în
profunzimea metodei prezentate. La finalul acestei etape, fiecare elev va deveni „expert” în conținutul
respectiv. Elevii care au numărul 1 trebuie să c itească materialul referitor la descrierea generală a
metodei, numărul 2 citește despre implementarea metodei în problema rucsacului , iar elevii cu numărul
trei se focalizează asupra codului problemei.
După ce s -a parcurs faza de lucru independent, se cons tituie grupurile de experți care dezbat
problema pe care urmează să o prezinte colegilor din grupul originar, se consultă privind modalitățile
de transmitere a informațiilor și aprofundează conținutul tehnicii.
Elevii refac grupurile „de baștină” și trans mit colegilor din grup conținutul în care sunt experți.
Această tehnică vizează ca toți elevii să cunoască date esențiale cu privire la metoda Greedy. Profesorul
monitorizează predarea, pentru a se asigura că informația este transmisă corect.
Ultima etap ă a tehnicii mozaic este aceea a evaluării. Realizarea feedbackului se face prin
reflecție de tipul închiderea cercului : profesorul urmărește o trecere în revistă a cunoștințelor, adresând
elevilor întrebări în legătură cu ceea ce au învățat. În formularea răspunsurilor, elevilor le este interzisă
fișa de documentare. Ultima etapă a tehnicii mozaic presupune organizarea frontală a activității.

118 TEMA 3
Conținut: P roblema spectacolelo r
Metode didactice: învățarea prin cooperare, reflecția, conversația
Tehnic ă de comunicare: turul galeriei și harta conceptuală
Mijloace de învățământ: fișe de lucru , coli flipchart, markere , calculator
Forme de organizare a instruirii: pe grupe
Profesorul anunță titlul lecției, și anume rezolvarea problemei spectacolelor. Colect ivul cercului este
împărțit pe doua grupe. Fiecare grupă primește câte o coală de flipchart și câte o fișă ce conține enunțul
problemei, iar o grupă primește descrierea rezolvării problemei împreună cu conținutul fișierului
spectacole.in și cealaltă grupă primește codul C++ al problemei. Se utilizează Turul galeriei . Pornind
de la fișele primite, elevii primei grupe trebuie să identifice datele de intrare, datele de ieșire , structurile
de date care intervin în rezolvarea problemei și să determine constituir ea soluției problemei . Elevii
celei de -a doua grupe vor avea de identificat structurile de date, să realizeze un fișier de intrare, să
testeze codul problemei și să exemplifice pașii de rezolvare. La finalul sarcinii de lucru, fiecare grup își
desemnează u n reprezentant care expune la tablă produsul muncii în echipă și se poziționează înaintea
lui în vederea acordării de lămuriri colegilor care vizitează galeria. Spectatorii galeriei pot completa
ideile făcând notițe în josul colii de flipchart .
Valorificâ nd fișele de lucru ale elevilor, profesorul concluzionează asupra rezolvării problemei
realizând schema de rezolvare a acesteia, folosind ca tehnică harta conceptuală.

119 Problema
spectacolelor
Date de intrare :
n-numărul de spectacole
a-vector de tip
înregist rare
x-ora de începere
y-ora de terminare
k-numărul spectacolului Date de ieșire :
m-numărul de
spectacolelor
selectate
s-vector care reține
numărul
spectacolului selectat void citește()
citește din fișier n
construiește vectorul a astfel :
Spectacol 1 2 3 4 5 6 7 8
Ora începere 9 12 8 10 16 14 20 19
Ora terminare 11 13 10 12 18 16 22 20

void sort ()
sortează elementele vectorului a după ora de
începere a spectacolului :
Spectacol 3 1 4 2 6 5 8 7
Ora începere 8 9 10 12 14 16 19 20
Ora terminare 10 11 12 13 16 18 21 22
void greedy ()
s[1]=1//selecteaz ă primul spectacol
Pentru i=2,n execută
Dacă ora la care începe spectacolul din
elementul curent al vectorului a este mai
mare sau egală cu ora la care se termină
ultimul spectacol adăugat la soluție, atunci
spectacolul este adăugat la soluție.
s 1 3 4 5 6 7
void afiseaza() :
parcurge vectorul s
și afișează a[s[i]].k
reprezint ă numărul
de ordine al
spectacolului selectat

120 TEMA 4
Conținut: Consolidare noțiuni teoretice. Problema Reactivi
Metode didactice: brainstorming -ul, expunerea, explicația, conversația rezolvarea de probleme,
cercetarea, programare, algoritmică, euristică , explozia stelară
Mijloace de învățământ: listă de control, fișă de lucru
Forme de organizare a instruirii: individuală, frontal.
Pentru a actualiza teoria tehnicii de programare Greedy, profesorul distribuie fiecărui elev câte
o fișă de lucru. În rezolvarea sarcinii de lucru elevii lucrează independent. Cadrul didactic solicită ca
cinci elevi doritori să prezinte rezolvarea fișe i. Res tul clasei intervine cu co mpletări, dacă au fost omise
anumite detalii relevante sau dacă fișa conține informații eronate.

Completați spațiile libere:
1. Numele metodei Înseamnă … .
2. Tehnica Greedy poate fi privită ca o particularizare a tehnicii …. …………în care se renunță la
mecanismul de întoarcere.
3. Ambele tehnici oferă soluții sub formă de ……………
4. Tehnica Backtracking poate oferi ……….. soluțiile problemei, în timp ce tehnica Greedy oferă
….…..soluție.
5. Tehnica Greedy cond uce la timp de calcul …………….
6. Soluțiile se construiesc …………
7. Pentru multe probleme ……se cunosc algoritmi Greedy .
8. Schema generală Greedy are prima etapă ………… ………………………………………………
și a doua etapă…………….
După reactualizar ea cunoștințelor elevii primesc spre rezolvare problema Reactivi. Aceștia vor
avea la dispoziție aproximativ 3 0 de minute pentru a se documenta asupra problemei date și pentru a
elabora un algoritm de rezolvare. Fiecare elev va lucra individual la calculat or pentru identificarea
structurilor de date ce intervin în rezolvarea problemei , stabilirea etapelor de rezolvare și vor
argumenta alegerea tehnicii Greedy în rezolvarea acestei probleme. În urma documentării, utilizând
metoda explozia stelară 4 elevii vo r extrage câte o întrebare de tipul:

Ce? Cu ce? Cum?
De ce?

121 Fiecare elev din cei 4 își alege 1 -2 colegi, organizându -se în patru grupuri. Grupurile
cooperează în elaborarea răspunsurilor,iar la expirarea timpului, elevii prezintă răspunsurile elaborate
(un reprezentant al grupului). Elevii celorlalte grupuri formulează întrebări sau fac completări.
La finalul discuțiilor elevii vor implementa algoritmul de rezolvare al problemei în limbaj C++
și vor realiza teste pentru diferite seturi de date de intrare.
TEMA 5
Conținu t: Prezentarea proiectelor
Metodă de evaluare: proiectul
Mijloace de învățământ: prezentări PowerPoint.
Forme de organizare a instruirii: pe grupe , frontal.
Încă de la prima ședință a cercului elevii au primit de realizat un proiect în grupe de câte doi.
Proiectul a constat în alegerea unei probleme, date la olimpiadă, care se rezolvă utilizând tehnica
Greedy. Pentru realizarea proiectului elevii au avut de urmărit structura de la tema 2 din fișa de
documentare, structură pe care o regăsim și în cadrul luc rării de față, în capitolul 2 la probleme care se
rezolvă cu ajutorul tehnicii Greedy.
Proiectul a vizat aspecte atât teoretice, cât și practice și a urmărit: însușirea unor metode de
investigație științifică (căutarea și utilizarea bibliografiei necesare , a programului CodeBlocks, a
limbajului C++ și a altor lucrări de documentare); găsirea unor soluții de rezolvare originale,
organizarea și sintetizarea materialului și generalizarea problemei.
TEMA 6
Conținut: Descrierea metodei programării dinamice . Exe mplificare problema discretă a rucsacului
Metode didactice: Problematizarea, învățarea prin descoperire , conversația .
Mijloace de învățământ : aplicația didactică accesată cu ajutorul calculatorului
Forme de organizare: pe gupe, frontal și individual.
Elevi i primesc indicații pentru a accesa aplicația didactică implementată de profesor, unde vor găsi
structurate noțiunile teoretice despre programarea dinamică și exemplificarea metodei prin rezolvarea
problemei discrete a rucsacului.
Elevii sunt împărțiți în trei grupe de studiu,aceștia vor parcurge materialul pus la dispoziție cu
ajutorul aplicației, prima grupă are sarcina să aprofundeze noțiunile teoretice, cea de -a doua metoda de
rezolvare a problemei rucsacului, iar cea de -a treia grupă va studia codul C+ + de rezolvare al
problemei.
Întrebările frontale sau individuale utilizate în etapa de pregătire a introducerii noțiun ii de
programare dinamică , a prezentării metodei , întrebări care se adresează capacității de reacționare a
elevului , pot gene ra noi situa ții conflictuale . Pe cât posibil, cadrul didactic trebuie să gestioneze el
însuși apariția situațiilor -problemă. La modul ideal, ele trebuie să apară de la sine în mintea elevului.
Relativ la condițiile pedagogice ale acestor situații conflictuale generate de anumite probleme practice
putem spune că problemele trebuie să aibă un sens precis și să fie enunțate într -un moment „optim" al
lecției. Ele trebuie să înglobeze cunoștințe anterior însușite de elev, să le trezească interesul, să le
solicite un anumit efort mental creator. Există părerea că rezolvarea problemei poate fi privită ca un

122 proces prin care elevul descoperă că o combinație de reguli învățate anterior se poate aplica pentru
găsirea soluției unei noi situații conflictuale. în acest sens se pot e videnția următoarele etape in
rezolvarea problemei:
• Prezentarea problemei (verbal, scris, grafic etc.).
• Definirea problemei de către elev în sensul distingerii caracteristicilor esențiale ale
situației, însușirii enunțului, găsirii legăturii între date, in formații etc.
• Formularea de către elev a anumitor criterii, ipoteze care pot fi aplicate în vederea
găsirii unei soluții.
• Verificarea succesivă a unor asemenea ipoteze, eventual și a altora noi, și găsirea
efectivă a unei soluții (sau a tuturor).
Desigur c ă în contextul de mai sus expresiile situare conflictuală, problemă, rezolvare de problemă
se referă la probleme și soluții noi, necunoscute încă de elev, și nu la ceva de tipul substituirii de valori
numerice în expresii date, execuția unui program dat pe ntru niște valori de intrare etc. Utilizarea în
predare a acestei metode este totdeauna utilă în momentul în care se și găsește rezolvarea conflictului.
Fiecare grupă își va alege un reprezentant care va prezenta materialul studiat, profesorul urmărește
evoluția prezentării, intervine cu întrebări sau răspunsuri în funcție situație.
Codul problemei va fi compilat în CodeBlocks și se va verifica execuția acestuia pe diferite seturi
de date de intrare.
TEMA 7
Conținut: Implementarea metodei dinamice în rezolv area problemei Tren .
Metode didactice: exercițiul și modelarea.
Mijloace de învățământ : fișa de lucru și calculatorul
Forme de organizare : frontal și individual.
Elevii primesc pe fișa de lucru enunțul complet pentru problema Pachete, folosindu -se de model ul
problemei rucsacului și documentându -se pe Internet fiecare elev va încerca sa rezolve această
problemă.
La modul cel mai general, exercițiile pot fi privite ca acțiuni concrete efectuate conștient și repetat
în scopul dobândirii unor priceperi și depri nderi (mai rar cunoștințe) noi, pentru a ușura anumite
activități și a contribui la dezvoltarea unor aptitudini . Avantajele metodei exercițiului sunt:
• Se poate forma o gândire productivă, creatoare.
• Se oferă posibilitatea câștigării unei anumite independen țe.
• Se oferă posibilitatea inițierii unui dialog -conversație cu obiective precise asupra unor metode și
soluții.
• Se activează atitudinea critică și poate crește discernământul elevilor în privința celor mai bune
metode de lucru.
• Se oferă profesorului o anu mită posibilitate de a analiza și evalua activitatea sau performanțele
generale ale unui elev.
Modelarea ca metodă pedagogică poate fi descrisă ca fiind un mod de lucru prin care gândirea
elevului este condusă la descoperirea adevărului, folosind un așa -numit model și utilizându -se

123 raționamentul prin analogie. Modelul și metoda în sine nu presupun o asemănare perfectă cu cazurile
reale inițial specificate, ci numai o analogie.
Momentele cunoașterii în procesul modelării sunt:
• Trecerea de la original la mode l.
• Transformarea modelului sau experimentarea pe model.
• Transferul pe original a rezultatelor obținute pe model.

TEMA 8
Conținut: Implementarea metodei dinamice în rezolvarea problemei Pachete.
Metode didactice: învățarea prin colaborare – “creioanele la mijloc” .
Mijloace de învățământ : fișa de lucru , calculatorul
Forme de organizare: pe grupe și frontal .
Vom discuta rezolv area problemei aplicând o metoda – creioanele la mijloc , care are la bază
învățare a prin colaborare .
Se formează cele cinci grupe, se specifică sarcina de lucru a fiecărei grupe, se anunță regulile ce
trebuie respectate. Expunerea ideilor de către fiecare elev din grupul de învățare prin colaborare este
însoțită de plasarea creionului pe masă (bancă). Elevul care a luat cuvântul o dată, nu mai are dreptul să
intervină decât după ce toate creioanele se află pe masă (în acest moment fiind evident faptul că fiecare
membru al grupului a avut prilejul să -și exprime punctul de vedere asupra temei dezbătute sau
problemei propuse spre rezolvare). Toți membrii grupului sunt egali și nimeni nu are voie să domine.
Grupa 1 Grupa 2 Grupa 3 Grupa 4 Grupa 5
Prezentați enunțul
problemei.
Date de intrare
Date de ieșire Explicați timpul
afișat pentru
pachete.in
4
2 1
1 5
3 3
2 4 Identificați
subproblemele
problemei date. Stabiliți structurile
de date și relația
de recurență. Explicați codul
C++ al problemei.
Principalele avantaje ale utilizării acestei tehnici sunt următoarele: formarea și consolidarea d eprinderii
de ascultare activă, dezvoltar ea competenț elor de comunicare, participarea activă, implicarea tuturor
elevilor în realizarea sarcinilor propuse, dezvolt area capacității argumentative, promovarea
interînvățării, formarea și dezvoltarea capacității reflective;
TEMA 9
Conținut: Prezentarea proiectel or
Metodă de evaluare: proiectul
Mijloace de învățământ: prezentări PowerPoint.
Forme de organizare a instruirii: pe grupe, frontal.

124 Elevii au primit de realizat un proiect în grupe de câte doi. Proiectul a constat în alegerea unei
probleme, date la olimp iadă, care se rezolvă utilizând tehnica programării dinamice. Pentru realizarea
proiectului elevii au avut de urmărit structura cu care au fost familiarizați la capitolul metodei Greedy,
structură pe care o regăsim și în cadrul lucrării de față, în capitol ul 2 la probleme care se rezolvă cu
ajutorul tehnicii programării dinamice.
Proiectul a vizat aspecte atât teoretice, cât și practice și a urmărit: însușirea unor metode de
investigație științifică (căutarea și utilizarea bibliografiei necesare, a program ului CodeBlocks, a
limbajului C++ și a altor lucrări de documentare); găsirea unor soluții de rezolvare originale,
organizarea și sintetizarea materialului și generalizarea problemei.
TEMA 10
Conținut: Concluzii finale
Metode didactice: conversație de apro fundare, învățarea asistată de calculator
Mijloace de învățământ: calculatorul
Forme de organizare a instruiri: frontal.
Profesorul le prezintă elevilor participanți la cerc strategii de abordare a problemelor și
compararea celor două metode prezentate în cadrul cercului de informatică .
Strategii de abordare a problemelor:
Pas1: Citiți tot enunțul și faceți -vă o idee aproximativă despre gradul de dificultate problemei.
Verificați dacă se dau limite pentru datele de intrare (numărul maxim de elemente ale un ui vector și
valoarea maximă a acestora, etc.) și pentru timpii de execuție pentru fiecare test.
Pas2: Citiți din nou enunțul, de data aceasta cu mare grijă. Tratați problema în cazul cel mai general.
Iată mai multe exemple frecvente în care enunțul nu est e limpede:
 Daca nu se precizează cât de mari pot fi întregii dintr -un vector, nu lucrați pe int, ci pe long
long int ;
 În problemele de geometrie analitică, e bine să presupuneți că punctele nu au coordo nate
întregi, ci reale;
 De asemenea, pătratele și drep tunghiurile nu au neapă rat latu ri paralele cu axele, ci sunt
așezate oricum î n plan;
 Dacă fișierul de intrare conține șiruri de caractere, să nu presupuneți că ele au maxim 255 de
caractere. Scrieți propria procedură de citire a unui șir de caractere, care să citească din fișier
caracter cu caracter până la sfârșitul de linie.
Pas3: Începeți să vă gândiți la algoritmi cât mai buni, estimând în același timp și cât v -ar lua ca să -i
implementați. Faceți, pentru fiecare idee calculul complexității. Nu trebuie neapărat să găsiți cel mai
eficient algoritm, ci numai unul suficient de bun. În general, trebuie ca, dintre toți algoritmii care se
încadrează în timpul de rulare, să -l alegeți pe cel care este cel mai ușor de implementat.
Pas4: Dintre toate ideile de impl ementare găsite, o veți alege pe cea mai scurtă ca lungime de cod.
Pas5: Alegeți -vă numele de varia bile în așa fel încât programul să fie clar.

125 Pas6: Programați modular. Faceți subprograme separate pentru citirea și inițializarea datelor, pentru
sortare, p entru afișarea rezultatelor, etc.
Pas7: Depanarea și testarea se începe cu un test nici prea simplu, nici prea complicat (și ușor de
urmărit cu creionul pe hârtie) și executați -l de la cap la coadă. Dacă la unul din teste programul nu
merge corespunzător , rulați din nou testul, dar de data aceasta subprogram cu subprogram. După
fiecare subprogram evaluați variabilele și vedeți dacă au valorile așteptate. În felul acesta puteți
localiza cu precizie subprogramul, apoi linia unde se află eroarea. Corectați în această maniera toate
erorile, până când testul este trecut.
Compararea metodelor de construire a algoritmilor de optimizare :
Pentru determinarea soluției optime, se va alege metoda Greedy, doar dacă se poate demonstra
că ea furnizează un rezultat corect; altfel se va alege metoda programării dinamice.
În ambele metode alegerea elementului xk al soluției este irevocabilă și poate duce la obținerea
soluției optime în cazul problemelor care au proprietatea de optim local, adică soluția optimă a
problemei cu d imensiunea n a datelor de intrare conține soluțiile optime ale subproblemelor similar cu
problema inițială, dar de dimensiune mai mică. Deosebirea dintre cele două metode constă în modul în
care este construită soluția:
În cazul metodei Greedy, se porneșt e de la soluțiile optime locale și pe baza lor se construiește
soluția optimă globală. Problema este descompusă în subprobleme și soluția este construită treptat.
Alegerea soluțiilor optime locale nu garantează că soluția optimă globală este și optimă, deo arece
optimul local nu implică întotdeauna optimul global. Pentru a fi siguri că soluția aleasă este optimă
trebuie să se demonstreze că modul de alegere a optimului local implică optimul global. Metoda
Greedy este mai simpla decât metoda programării dinam ice, deoarece la fiecare pas se tratează numai
subproblema curentă, iar ordinul de complexitate este mai mic decât în cazul programării dinamice.
În cazul metodei programării dinam ice, se pornește de la structura problemei inițiale, care
corespunde soluți ei optime globale și se descompune în subprobleme care în care se determină soluțiile
optime ale subproblemelor. Ea se poate aplica în problemele în care optimul global implică optimul
global. Etapa cea mai dificilă este cea de determinare a structurii sol uției optime. Dacă se cunoaște
structura soluției optime, metoda garantează o bținerea soluției optime a problemei prin determinarea
optimului local.
După prezentarea celor de mai sus, profesorul face aprecieri generale cu privire la modul de
desfășurare a celor zece ședințe din cadrul cercului și a cunoștințelor însușite datorită participării la
acest cerc, și aprecieri individuale fiecărui participant la cerc prin analiza activității și anunțarea
calificativelor obținute .
4.3. Metode de evaluare
Evaluarea activității elevilor desfășurată în cadrul cercului de informatică se va realiza continuu,
pe parcursul fiecărei ședințe de cerc. Principalele metode de evaluare utilizate sunt:
– observația sistematică (curentă) a conduitei elevilor în cadrul ședințelor de cerc;
– probe practice
– referat
– proiect
Aceste metode au rolul de a facilita crearea unor condiții de învățare plăcute, favorabile învățării
cu caracter formativ .

126 Punctajul acordat pentru îndeplinirea sarcinilor pe parcursul activității desfășurate în cadrul
cercului de informatică este:
– 5-10 puncte reprezintă calificativul “Satisfăcător”
– 10-15 puncte reprezintă calificativul “Bine”
– 15-20 puncte – reprezintă calificativul “Foarte Bine”
Criteriile care au stat la baza stabilirii calificativelor au fost gradul de implicare al fiecărui elev în
activitățile desfășurate în cadrul cercului de informatică, corectitudinea rezolvării sarcinilor, calitatea
materialelor realizate.
Evaluarea inițială a constat în aplicarea unui test docimologic prin care s -au verificat
cunoștințele despre elaborarea algoritmilor. Au fost evaluate competențele specifice programei pentru
clasa a X -a, gradul de dificultate al testului fiind unul mediu. Pentru a menține interesul elevilor, au
fost proiectați itemi diferiți: obiectivi, semiobie ctivi și subiectivi.
Evaluarea formativă sau continuă s -a realizat pe tot parcursul cercului. Elevii au avut de
completat fișe individuale de lucru, au participat în mod activ la activitățile pr opuse de profesor. Fiind
mai mult un curs practic decât teor etic, activitățile desfășurate au avut rol interactiv, atât între elevi, la
nivel de grup, cât și între elevi și cadrul didactic. Evaluarea formativă și feedback -ul obținut
demonstrează atingerea obiectivelor propuse, elevii consolidându -și noțiunile despr e tehnicile de
programare pe care le -au aplicat în rezolvarea problemelor .
Observarea sistematică a activităților și a comportamentului elevilor în timpul activității didactice
este o tehnică de evaluare ce furnizează profesorului o serie de informații, di verse și complete, greu
de obținut prin intermediul metodelor de evaluare tradițională. Observarea este adeseori însoțită de
aprecierea verbală asupra activității elevilor.
Pentru a înregistra informațiile de care are nevoie, profesorul are la dispoziție: fișa de observații
curente, fișa de evaluare, scara de clasificare, lista de control/verificare și fișa de caracterizare psiho –
pedagogică (la final de ciclu).
Evaluarea sumativă a fost realizată la sfârșitul fiec ărui capitol . Pe măsura parcurgerii celor
doua tehnici de programare, elevii au avut ca temă pentru acasă de realizat proiecte prin care au
exemplificat implementarea metodei pentru o problemă dată . Clasei îi revine rolul de a face aprecieri
cu privire la materialul prezentat. Astfel are loc și int erevaluarea prin care se exersează competența de
comunicare a elevilor.
Tema proiectelor a fost anunțată încă de la începutul fiecărui capitol. Tot atunci s -au constituit
și grupele. Această formă de evaluare place foarte mult elevilor, deoarece pot folos i pe lângă mijloace
scrise, și ilustrații, exemplificări, etc. Au fost rezervat câte două ore la sfârșitul fiecărui capitol , astfel
încât toate grupele să poată prezenta rezultatele muncii lor.
Proiectul este un demers evaluativ mai a mplu, ce permite o ap reciere complexă a învățării,
ajutând la identificarea unor calități individuale ale elevilor. Proiectul reprezintă o formă de evaluare ce
conduce la aprecierea unor capacități și cunoștințe precum apropierea unor metode de investigație
științifice, găsire a unor soluții originale, organizarea și sintetizarea materialului și generalizarea
problemei.

127 4.4. Analiza activității
În urma observării activității elevilor s -au constatat următoarele:
 Elevii au dat dovadă de curiozitate și interes pentru fiecare temă abordată, aceștia realizând
progrese notabile, de la o ședință la alta, din punct de vedere al aprofundării noțiunilor.
 Elevii s -au famili arizat rapid cu cerințele de lucru în cadrul cercului.
 Elevii au fost receptivi la modalitatea de abordare a metodolo giei ședințelor în cadrul
cercului, dezvoltând abilități în rezolvarea atât a fișelor individuale, sau a unor fișe de
documentare în vederea realizării unui proiect.
 Progresele elevilor au fost înregistrate treptat, de la un parcurs care a început lent în
perioada de acomodare cu rigorile activităților specifice cercului, pe parcurs elevii au dat
dovadă de adaptabilitate la cerințele fiecărei ședințe de cerc.
 Pe parcursul ședințelor a crescut nivelul de interes, devenind mai receptivi la nou, gradul de
implicare crescând.
 Elevii au început să realizeze conexiuni între metodele de rezolvare a problemelor.
 Elevii au asimilat mult mai ușor informațiile noi, datorită tipului de activități realizate, în
mare parte fiind de natură practică.
 Elevii și -au îmbogățit vocabularul, formându -și un limbaj științific specific.
În tabelul de mai jos se pot observa calificativele obținute de fiecare elev, în cadrul fiecărei ședințe
de cerc.
S1 S2 S3 S4 S5 S6 S7 S8 S9
E1 FB FB FB B FB FB B B FB
E2 B FB FB FB FB FB FB B B
E3 S B FB FB FB B B FB FB
E4 FB B FB FB FB FB B B B
E5 B B FB B FB FB FB B FB
E6 S FB FB FB B FB B FB B
E7 B FB B FB FB FB B B B
E8 FB B FB B B FB FB B B
E9 B FB B FB FB B FB B B
E10 B FB FB FB FB FB FB FB B

128 Graficul calificativelor obținute în c adrul fiecărei ședințe a cercului este următorul :

Graficul scoate în evidență modul în care elevii s -au implicat în activitățile desfășurate în cadrul
fiecărei ședințe astfel:
În ședințele 2 -6 frecvența calificativelor FB este mai ridicată, comparativ c u ședințele 6-9 unde
frecvența acestor califi cative a scăzut, ceea ce arată că problemele rezolvate cu tehnica Greedy au fost
mai ușor de înțeles și de explicat de către elevi, pe când la problemele rezolvate cu tehnica programării
dinamice elevii au întâm pinat dificultăți la identificarea subproblemelor și la înțelegerea relației de
recurență.
De asemenea am observat că elevii au fost mai receptivi în cadrul activităților desfășurate pe
grupe, comparativ cu activitățile de muncă independentă.
Rezultatele activităților de cerc vor fi puse în valoare cu diferite ocazii: referate pentru sesiuni de
comunicare, rezolvare de probleme și participarea la concursuri și olimpiade școlare.

129 Concluzii
Lucrarea pre zentă și -a propus să scoată în evidență câteva aspecte metodologice în studiul
“Tehnicilor de programare pentru probleme de optimizare” în cadrul cercului de informatică.
Lucrarea este s tructurată în două părți: prima parte teoretică, iar cea de -a doua prezintă
demersul metodico -experimental. Partea teoretic ă constituie o sinteză a cunoștințelor privind tehnicile
de programar e Greedy și programare dinamică, iar cea de -a doua parte o prezentare a modalităților de
stimulare a învățării celor două tehnici de programare .
În această lucrare metodico -științifică m i-am propus să descriu modul în care am desfășurat
activitatea instructiv -formativă, metodele și procedeele aplicate în scopul obținerii de rezultate prin
aplicarea metodelor interactive de învățare.
Scopul experimentului pedagogic a fost de aprofundare a aptitudinilor elevilor, stimulând
interesul pentru studiul tehnicilor de programare, utilizând metode active de învățare centrate pe elev
proiectând activitățile în mod interactiv și evaluând activitățile cu metode atât tradiționale, cât mai ales
alternat ive de evaluare.
În cadrul cercului am organizat activități utilizând metode preponderent interactive c u scopul de
a-i ajuta pe elevi s ă învețe a observa, cerceta, studia și verifica rezultatele obținute prin rezolvarea
problemelor aplicând una din cele d oua tehnici propuse studiului în cadrul cercului.
Consider că abordarea interactivă contribuie la formarea și dezvoltarea flexibilității gândirii, a
capacității de aplicare a cunoștințelor dobândite de elevi, asigură o înțelegere unitară și permite elevul ui
să realizeze trecerea de la teorie la practică.
În scopul optimizării procesului de predare – învățare – evaluare, noi, profesorii va trebui să
căutăm în permanență cele mai eficiente metode, strategii pentru a activiza și a mobiliza elevul, pentru
a forma competențe ce îi vor aduce acestuia rezultate bune și foarte bune la diferite evaluări. Așadar,
este important să dezvoltăm capacitatea de a studia continuu, să valorificăm la maximum potențialul
fiecărui elev, dându -i ocazia de a se afirma, de a -și etala cunoștințele, dar și priceperile, deprinderile,
abilitățile

130 Bibliografie
I. Lucrări de specialitate (Informatică)
[1] Andonie R., Gârbacea I.: Algoritmi fundamentali, o perspectivă C++ , Ed. Libris, 1995
[2] Apostol C., Roșca I. Gh., Roșca V., Ghili -Micu B., Introducere în programare. Teorie și aplicații ,
Editura București, 1993
[3] Atanasiu A.; Concursuri de informatică . Editura Petrion, 1995
[4] Cerchez E.; Informatică – Culegere de probleme pentru liceu , Ed. Polirom,Iași, 2002
[5] Cerchez E., Șerb an, M.; Informatică – manual pentru clasa a X -a., Ed. Polirom, Iași, 2000
[6] Cerchez E., Șerban, M. , Programarea în Limbajul C/C++ pentru liceu , Ed. Polirom, Iași, 2005
[7] Cormen, T.H., Leiserson C.E., Rivest, R.L, Introducere în algoritmi , Ed. Agora 200 0
[8] Lica D., Informatică. Fundamentele programării. Culegere de probleme pentru clasa a XI , Editura
L&S Soft, București, 2006
[9] Logofătu G., C++. Probleme rezolvate și algoritmi, Editura Polirom, Iași, 2001
[10] Livovschi L., Georgescu H, Sinteza și An aliza Algoritmilor , Ed. Științifică și Enciclopedică,
București, 1986
[11] Miloș escu M.; Informatică , manual pentru clasa a XI -a, specializarea matematică -informatică
C++ , Ed. Didactică și Pedagogică , 2011
[12] Miloș escu M.; Informatică, manual pentru clasa a IX -a, profil real C++ , Ed. Didactică și
Pedagogică , 2011
[13] Odăgescu, I.; Metode și tehnici de programare , Ed. Computer Libr is Agora,Cluj, 1998
[14] Sorin T., Informatica. Tehnici de programare , Editura L&S Infomat, București, 2002
II. Lucrări metodice
[15] Cerghit I., Metode de învățământ , Iași, Editura Polirom, 2006.
[16] Cerghit I., Perfecționarea lecției în școala modernă , Editura Didactică și pedagogică, București,
1983.
[17] Cerghit I, Sisteme de instruire alternative și complementare. Structuri, stiluri și strategii , Editura
Polirom, Iași, 2002.
[18] Cristea S. , Dicționar de pedagogie , Litera Educațional, Chișinău, 200 2.
[19] Cucoș C. , Psihopedagogie, Editura Polirom, Iași, 2009.
[20] Dragu, Anca, Cristea, Sorin, Psihologie și pedagogie școlară, ediția a II -a revizuită și adăugită,
Editura Ovidius University Press, Constanța, 2003.
[21] Dulamă, Maria – Eliza, Metodolog ie didactică , Editura Clusium, Cluj -Napoca, 2002.
[22] Frunză V., Teoria și metodologia curriculumului , Constanța, Editura Muntenia, 2003.

131 [23] Frunză V., Elemente de metodologie a instruirii , Editura Muntenia, Constanța, 2004.
[24] Fulea T. – Tehnologii i nformaționale în procesul de predare -învățare a informaticii , Tiraspol,
2006
[25] Ionescu, Miron , Radu, Ioan, Didactica modernă , Cluj -Napoca, Editura Dacia, 2001
[26] Joița, Elena, Educație cognitivă, fundamente, Metodologie , Editura Polirom, Iași, 2002.
[27] Masalagiu C., Asiminoaei I.; Didactica predării informaticii , Ed. Polirom 2004
[28] Nicola I ., Tratat de pedagogie școlară , Editura Aramis, București, 2000.
[29] Nicolescu B ., Transdisciplinaritatea (manifest), Editura Polirom, Iași, 1999.
[30] Petre C., Popa D., Crăciunoiu S.; Metodica predării informaticii și tehnologiei informației , Ed.
Arves 2002
[31] Șoitu, Laurențiu, Pedagogia comunicării , Editura Didactică și pedagogică, București, 1997.
[32] Vlădulescu L. – Îndrumar de metodica si practica pe dagogica – Editura Printech 2000
[33] Vlădulescu L. – Fundamente ale educației și profesionalizării tehnologice, Editura Didactica și
Pedagogica, RA, București, 1999
III. Surse Web
[34] Elena Pelican https://sites.google.com/site/elapelican/home/teaching/algoritmi -si-programare
[35] https://walkinthroughlife .wordpress.com/2010/11/21/programare -dinamica -subsir -comun –
maximal/
[36] MIT https://ocw.mit.edu/courses/elec trical -engineering -and-computer -science/6 -006-introduction –
to-algorithms -fall-2011/lecture -videos/
[37] https://informaticacnet.wordpress.com/category/clasa -a-xi-a/

132 Anexa 1

TEST INIȚIAL
profil real – informatică

 Toate subiectele sunt obligatorii. Se acordă 2 puncte din oficiu
 Timpul efectiv de lucru este de 50 minute
 Ȋn rezolvările cerute, identificatorii utilizați trebuie să respecte precizările din enunț, iar ȋn
lipsa unor precizări explicite, notațiile trebuie să corespundă cu semnificațiile asocia te
acestora.
Pentru următorii patru itemi scrieți pe foaia de rezolvare litera corespunzătoare
răspunsului corect.

1. O expresie C/C++ care are valoarea 1 este:
a. floor(7)+1 = =ceil(7); b. floor(7.19)== ceil(7.19) ;
c. floor(7.19)== floor(7.91); d. floor(7.91)== ceil(7.19);
1 punct
2. Se consideră varia bilele x, y, z, w care memorează câte un număr real, astfel încât expresia C/C++
alăturată are valoarea 1.
x<y && z<w && w<x;
Variabila care are valoarea cel mai mare dintre numerele menționate mai sus este:
a. x b. y c. z d. w
1 punct
3. Pentru a calcula ȋn mod eficient media aritm etică a elementelor unui tablou unidimensional cu n
componente numere naturale, toate egale, este necesar și suficient să se execute:

a. o singură instrucțiune de atribuire b. o singură parcurgere a tabloului și o
singură atribuire
c. o singură parcurgere a tabloului d. două parcurgeri ale tabloului
două atribuiri
1 punct
4. Care din secvențele de program de mai jos afișează corect elementele v[0], v[1], v[2],…, v[n -1] ale
unui vector de numere întregi :
a.
i=0;
while (i<n)
{printf(”%d”,v[i] ); i++;}
b.
i=0;
while (i<n)
{i ++; printf(”%d”,v[i]); }

c.
i=0;
do
{ i ++; printf(”%d”,v[i]); }
while (i<n); d.
i=0;
do
{ i ++; printf(”%d”,v[i]); }
while (i>n);

2 puncte
5. Ȋn secvența următoare de instrucțiuni, variabilele i și j sunt de tip întreg .
for (i=0;i<=4;i++)
{for(……………………..)
cout <<j<<’’; | printf(”%d”, j);

133 cout << endl; | printf(” \n”,);
}
Rescrieți secvența, completând zona punctată astfel încât , ȋn urma executării secvenței obținute,
să se afișeze pe ecran, ȋn ordine numerele de mai jos.

0
1 0
2 1 0
3 2 1 0
4 3 2 1 0
2 puncte
6. Se citește de la tastatură un număr natural nenul și se cere să se scrie numărul de cifre distincte din
scrierea acestuia. Descrieți un algoritm pentru a rezolva această problemă. Menționa ți rolul tuturor
variabilelor care intervin ȋn prelucrarea realizată și indicați datele de intrare, respectiv datele de ieșire
ale problemei enunțate.
3 puncte
7. Scrieți un program C/C++ care citește de la tastatură un număr natural n (2<n<20), construiește ȋn
memorie și afișează pe ecran o matrice cu n linii și n coloane numerotate de la 1 la n. Fiecare element
din matrice aflat pe o linie impară va fi egal cu numărul liniei pe care se află și fiecare element aflat pe
o linie pară va fi egal cu numărul coloanei pe care se află.
Elementele matricei vor fi afișate pe ecran, câte o linie a matricei pe câte o linie a ecranului cu
câte un spațiu între elementele fiecărei linii.
Exemplu: pentru n=5 se va afișa: 1 1 1 1 1
1 2 3 4 5
3 3 3 3 3
1 2 3 4 5
5 5 5 5 5
4 puncte
8. Ȋn fișier ul numere.txt sunt memorate cel puțin 3 și cel mult 90 de numere întregi cu cel mult patru
cifre fiecare, separate prin câte un spațiu. Scrieți un program eficient ȋn limbajul C/C++ care afișează
pe ecran trei numere aflate pe poziții consecutive ȋn fișie r, care sunt ȋn ordine strict crescătoare. Dacă
există mai multe astfel de secvențe, programul afișează una dintre acestea, iar dacă ȋn fișier nu există
astfel de secvențe se afișează mesajul NU EXISTA.
Exemplu: dacă fișierul numere.txt conține, ȋn această ordine, numerele 60 12 15 110 45 27 se vor afișa
numerele 12 15 110.
4 puncte

BAREM DE CORECTARE ȘI NOTARE

 Nu se acordă punct aje intermediare, altele decât cele precizate explicit ȋn barem. Nu se
acordă fracțiuni de punct.
 Se acordă 2 puncte din oficiu.
 Se punctează oricare alte formulări/modalități de rezolvare corectă a cerințelor.
 Ȋn programele cerute, datele de intrare se co nsideră corecte dacă au fost validate.
 Utilizarea unui tip de date care depășește domeniul de valori precizat ȋn enunț este
acceptată dacă acest lucru nu afectează corectitudinea ȋn funcționarea programului.

134
Subiect Punctaj acordat
1. – c 1p
2. – b 1p
3. – a 1p
4. – a 2p
5. 2p
6. 3p – descrierea unui algoritm corect care să rezolve problema; 1p
– coerența explicării metodei de lucru 0,5p
–descrierea rolului variabilelor necesare rezolvării problemei; 1p
– indicarea datelor de intrare și a datelor de ieșire 0,5p

7. 4p – declararea corectă a tuturor variabilelor (tablou și variabile
simple); 0,5p
– citirea corectă a variabilelor simple; 1p
– memorarea corectă a valorilor cerute pe linii pare; 0,5p
– memorarea corectă a valorilor cerute pe linii impare; 0,5p
– afișare a tabloului conform cerinței; 1p
– corectitudinea globală a programului 0,5p

8. 4p – declarare , operații cu fișiere, pregătire ȋn vederea citirii, citire
din fișier; 0,5p
– modalitate de citire a valorilor cerute; 0,5p
– respectarea condiției pentru varia bilele cerute; 1p
– determinarea și afișarea valorilor cu proprietatea cerută (se
acordă punctajul chiar dacă nu sunt respectate condițiile de
eficiență); 1p
– utilizarea unui algoritm eficient 0,5p
– corectitudinea globală a programului 0,5p

INTERPRETAR EA TESTULUI

Testul inițial la informatică proiectat pentru cercul de informatică, profil real conține , itemi
obiectivi – cu alegere multiplă, itemi semiobiectivi – cu răspuns scurt și itemi subiectivi – descrieri de
algoritmi, rezolvare de probleme,:
– itemi cu alegere multiplă solicită alegerea unui răspuns dintr -o listă de alternative;
– itemi semiobiectivi: pot fi itemi cu răspunsuri scurte, fiind formulați concis și specificând clar
natura răspunsului corect;
– itemi subiectivi: solicita răspun suri deschise, care în funcție de volumul și amploarea
răspunsului așteptat pot avea caracter restrictiv și extins; Itemii de tip rezolvare de probleme și cei de
tip eseu (structurat sau nestructurat) constituie variantele de itemi subiectivi utilizați în evaluarea
școlară.
Rezultatele obținute ȋn urma evaluării lucrărilor sunt prezentate în tabelul și graficul de mai jos:
Punctaj Sub 5p 5-9p 10-14p 15-20p
Nr. elevi 0 2 5 3

135

Analiza pentru testul administrat arată că:
– grupul testat are însușite compete nțele de bază necesare studiului tehnicilor de programare .
deoarece majoritatea elevilor au luat obținut peste 10 puncte;
– 80% dintre elevi au obținut calificativul Bine și Foarte Bine , însă 50% au obținut calificativul
Bine, ceea ce indică o dificultate ȋ n rezolvarea itemilor.

136 Anexa 2
 PROIECT DIDACTIC
 ȘCOALA: LICEUL TEORETIC „G. CĂLINESCU”
 DISCIPLINA : CERCUL DE INFORMATICĂ
 UNITATEA DE ÎNVǍȚARE: Tehnica de programare Greedy
– TEMA : Descrierea metodei Greedy. Exemplificare problema fracționară a rucsacului
 TIPUL LECȚIEI: Transmitere de noi informații
 DURATA: 100 minute
 LOCUL DE DESFASURARE: laborator de informatică
 PROFESOR: Marin Mădălina
 NIVELUL INITIAL AL CLASEI:
– Elevii și-au însuș it toate noțiunile teoretice legate de structurile de date și scrierea în limbaj C++ a
unei structuri ;
 COMPETENȚE GENERALE:
– Elaborarea algoritmilor de rezolvare a problemelor
 COMPETENȚE SPECIFICE:
2.1 Analiza problemei în scopul identificării metodei de programare adecvate pentru rezolvarea
problemei
2.2 Aplicarea creativă a me todelor de programare pentru rezolvarea unor probleme intradisciplinare
sau interdisciplinare, sau a unor probleme cu aplicabilitate practică
2.3 Analizarea comparativă a eficienței diferitelor metode de rezolvare a aceleiași probleme și
alegerea celui mai eficient algoritm de rezolvare a unei probleme
 COMPETENȚE DERIVATE: Elevii vor fi capabili să:
– definească principiul metodei Greedy
– identifice structurile de date care intervin în rezolvarea problemei date ;
– își însușească modul de utilizare și particular itățile specifice metodei Greedy ;
– explice implementarea tehnicii Greedy în rezolvarea problemei date ;
– utilizeze corect noțiunile teoretice însușite;
– realizeze operații în care să utilizeze corect noțiunile învățate;
Strategii didactice:
 Principii didactice :
– Principiul participării ș i învăță rii active;
– Principiul asigurării progresului gradat al performantei;

137 – Principiul conexiunii inverse;
 Metode de învăță mânt:
– metode de comunicare orala : expunerea, conversaț ia, problematizarea , discuția, explicația ;
– metode de acț iune: exercițiul , învăț area prin cooperare , lucrul la calculator ;
 Procedee de instruire :
– învăță rea prin descoperire prin aplicaț ii practice;
– tehnica de comunicare mozaic ;
 Forme de organizare : frontala ș i pe grupe ;
 Forme de dirijare a învățării : diri jata de profesor sau independenta;
 Metode de evaluare :
– evaluare inițiala
– întrebă ri orale;
– aprecieri verbale în timpul și la finalul lecției asupra fișelor realizate de către elevi;

138 DEMERSUL DIDACTIC
Nr.
Crt. Etapele
desfășurării
lecției Activitatea pro fesorului Activitatea
elevului Strategii
didactice Evaluarea
1 Moment
organizatoric Verificarea prezenței
Verificarea existenței condițiilor materiale
necesare desfășurării lecției Își pregătesc cele
necesare lecției. Conversația .
2 Reactualizarea
cuno ștințelor
învățate
anterior Adresarea câtorva întrebări punctuale privind
conținutul lecțiilor anterioare, prin reamintirea
câtorva funcții ale algoritmilor și a menționării
câtorva idei legate de optimizare.
1. Care sunt tipurile de date utilizate î n
descrie rea algoritmilor?
2. Care sunt tipurile de date derivate ?
3. Ce înțelegeți prin termenul optimizare ? Răspun d la
întrebări.

1. Tipurile pot fi
tipuri fundamentale
și tipuri derivate.
2. Tipurile derivate
sunt: tablourile ,
funcțiile, pointerii,
referințele •
structurile (sau
înregistrările)
3. Optimizarea
poate fi definită ca
determinarea «celei
mai bune» soluții la
anumite problem. Conversația
euristică Orală
3 Enunțarea
temei și a
obiectivelor Titlul lecției este : Descrierea metodei Greedy.
Exemplificare
Își notează în
caiete.
Manifestă atenție la
cele prezentate Conversația
frontală

4 Dirijarea
învățării Profesorul distribuie fiecărui elev o fișă de
documentare referitoare la tehnica Greedy,
aceasta este împărțită în trei secțiuni: descrierea
metodei, i mplementarea metodei Greedy în
problema fracționară a rucsacului și codul C++ al
problemei.
Textul oferit spre studiu este fragmentat în 3 părți Caută și propun
soluții;
Notează în caiete;
Participă la
rezolvarea
cerințelor ;
Analiză în grup Învățarea prin
cooperare
Reflexia
Lectura lentă Observația
sistematică

139 Nr.
Crt. Etapele
desfășurării
lecției Activitatea pro fesorului Activitatea
elevului Strategii
didactice Evaluarea
numerotate, iar colectivul este organizat pe 3
grupe a câte 3 elevi (grupuri „de baștină”).
Fiecare elev din gr upele realizate poartă un
număr de ordine (de la 1 la 3), corespunzător
secțiunii pe care trebuie să o studieze.
5 Asigurarea
feed-back -ului Se face prin reflecție de tipul închiderea cercului :
profesorul urmărește o trecere în revistă a
cunoștințelor, adresând elevilor întrebări în legătură
cu ceea ce au învățat. În formularea răspunsurilor,
elevilor le este interzisă fișa de documentare. Ultima
etapă a tehnicii mozaic presupune organizarea frontală
a activității . Poartă deschis o
discuție Conversația de
fixare
Orală
6 Anunțarea
temei
Se precizeaz ă tema ș i obiectivele importante. Notează tema.

140 Descrierea metodei Greedy. Exemplificare
(1) Aceasta e ste o metodă de implementare a algoritmilor, ea permite determinarea unei singure soluții care
corespunde unui anumit criteriu optim, în cazul problemelor în care soluția de construiește ca s ubmulțime a unei mulțimi
date.
Această metodă ea se aplică pentru tipul de probleme în care se dă o mulțime X conținând n date de intrare și se
cere determinarea unei submulțimi Y pentru care sunt îndeplinite condiții prestabilite. De obicei se pot determi na mai multe
mulțimi, în cerință există o condiție conform căreia, dintre toate submulțimile posibile, se păstrează o singură soluție
(optimă) ca rezultat final.
Totalitatea soluțiilor au proprietatea de tranzitivitate astfel : dacă submulțimea Y
X este o soluție posibilă și
Z
Y, atunci și Z este o soluție posibilă. Plecăm întotdeauna de la premisa că mulțimea vidă este o soluție posibilă.
Metoda aceasta abordează problemele în două moduri ce diferă prin ordinea d e executare a instrucțiunilor.
a. Pornim de la mulțimea vidă. Alegem pe rând, după un anumit criteriu, un element din mulțimea X care nu a fost
ales anterior. Alegerea acestuia și adăugarea lui la soluția parțială construită până în acel moment duce la o soluție posibilă,
elementul se adaugă și el soluției parțiale.
b. Modul de abordare este asemănător cu diferența că se stabilește de la început ordinea în care trebuie prelucrate
elementele mulțimii X.
Metoda Greedy nu determină toate soluțiile posibil e și aleage soluția optimă conform criteriului dat, ea selectează
pe rând câte un element îl introduce în soluția optimă doar dacă verifică condiția de optimizare cerută; așa se explică și
denumirea metodei Greedy (lacom).
Algoritmul construiește soluția pas cu pas pornind de la mulțimea vidă și adăugând la această mulțime elementul
cel mai potrivit, conform cerinței de selecție.
De fiecare dată când dorim să adăugăm un element vom verifica dacă noua mulțime constituie o soluție posibilă.
Dacă algoritmul va funcționa corect, prima soluție va fi soluția optimă a problemei, dar nu este și unica soluție.
O clasă de probleme specifică o constituie problemele de optimizare. Astfel, pentru determinarea maximul unei
funcții de cost abordarea metodei este de a a lege la fiecare pas elementul care crește cât mai mult costul respectivei funcții.
Observații:
 Metoda Greedy nu returnează soluția optimă pentru orice tip problemă. Atunci când soluția returnată nu este
optimă trebuie să știm în ce măsură suntem apropiați de soluția optimă.
 Pentru fiecare problemă în parte, după ce se identifică un algoritm, este obligatoriu să se demonstreze că acesta
conduce la soluția optimă.
Demonstrația faptului că se ajunge la soluția optimă este specifică fiecărei probleme în parte.
(2) Exemplificare Problema rucsacului fracționară(continuă)
Avem la dispoziție un rucsac ce poate duce maxim M kilograme și de N obiecte, caracterizate fiecare prin
greutate și valoare, ce trebuie introduse în rucsac.
Să se realizeze un program care umple rucsacul, astfel încât valoarea totală să fie maximă. Putem introduce
oricâte obiecte și fracții (bucăți) din obiecte.
Date de intrare
Pe prima linie a fișierului de intrare rucsac.in se găsesc două numere, primul fiind N, iar al doilea M (cu specificații le din
enunț). Pe următoarele N linii se găsesc, despărțite printr -un spațiu valoarea obiectului curent și greutatea acestuia.
Date de ieșire
În fișierul de ieșire rucsac.out vor fi specificate numărul de ordine al obiectului, precum și procentul în care a cesta poate fi
introdus în rucsac.
Exemplu
rucsac.in rucsac.out
5 100
1000 120
500 20
400 200
1000 100
25 1 2 100
4 79
5 100
Implementarea metodei Greedy
Vom reprezenta soluția problemei ca pe un vector x.
Vom ordona obiectele descrescător ținând cont d e
valoarea/greutate. Atâta timp cât obiectele încap în rucsac
le vom adăuga în întregime. La final adăugăm în rucsac o
bucată din următorul obiect neselectat .
Se folosesc următoarele subprograme: – Subprogramul citeste() – pentru citirea datelor
din fișier ș i realizarea vectorilor o, val, greu .
– Subprogramul sort() – sortează crescător
vectorul o după val/greu .
– Subprogramul greedy () – implementează
strategia pentru această problemă.

141 – Subprogramul afiseaza () – afișează soluția
problemei folosind informațiile din vectorul x.
Metoda Greedy este implementată astfel:
– Pas1 . Parcurg vectorul greu , pentru fiecare
obiect cu greutatea mai mică decât greutatea
maximă selectez obiectul astfel: x[o[i]]=1 , iar
greutatea maximă scade Gr-=greu[o[i]] .
– Pas2 . Dacă rucsacul nu a fo st umplut,se mai
parcurge odată vectorul x și selectăm primul
obiect neselectat x[o[i]]=(Gr*100)/greu[o[i]]. o 0 1 2 3 4
val 1000 500 400 1000 25
greu 120 20 200 100 1
val/greu 8.33 25 2 10 25
După apelul subprogramului sort() vectorul o devine:
o 1 4 3 0 2
După apelul subprogramului greedy() se construiește
vectorul x:
x 1 1 0.79 0 0
(3) Codul programului C++:
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("rucsac.in");
ofstream g("rucsac.out");
int o[100],N,M;
float val[100 ],greu[100],x[100],Gr;
void citeste()
{ int i;
f>>N>>M;
for (i=0;i<N;++i)
{
o[i]=i;
f>>val[i]>>greu[i];
}
f.close();}
void sort()
{ int i,aux,schimb;
do
{
schimb=0;
for (i=0;i<N -1;++i)
if (val[o[i]]/greu[o[i]]<val[o[i+1]]/greu[o[i+1]])
{
aux=o[i];
o[i]=o[i+1];
o[i+1]=aux; schimb=1;
}}while (schimb);}
void greedy()
{ int i;
for (i=0,Gr=M;i<N && Gr>greu[o[i]];++i)
{
x[o[i]]=1;
Gr-=greu[o[i]];
}
if(Gr>0)
for(i=0;i<n&&Gr>0;i++)
if(x[o[i]]==0) {x[o[i]]=(Gr*100)/greu[o[i]];Gr=0;}}
void afisare()
{ int i;
for (i=0;i<N;++i)
if (x[i]) g<<i+1<<" "<<x [i]*100<<endl;
g.close();
}
int main()
{
citeste();
sort();
greedy();
afisare();
return 0;
}
Observa ție
Putem demonstra că algoritm este corect doar dacă putem încărca în rucsac un fragment al unui obiect. Dacă trebuie să
încărcăm obiect ul doar în întregime (varianta discretă a problemei rucsacului) algoritmul Greedy nu mai funcționează. De
exemplu, pentru n=3, G=10, greu=(8, 6, 4), val=(8, 6, 4) , cu algoritmul Greedy se obține soluția x=(1,
0, 0) , iar greutatea obținută este 8. Dar pentru s oluția x=(0, 1, 1) obținem greutatea 10 , ceea ce însemnă că aceasta
este soluția optimă. Această problemă o vom studia în capitolul de programare dinamică.

Similar Posts