Neurochirurgie minim invazivă
"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv. Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice. www.neurohope.ro |
Tema Programare Dinamica
Last Updated: Sep 11 2011 13:27, Started by
Mitza444
, Sep 02 2011 20:57
·
0
#1
Posted 02 September 2011 - 20:57
Buna!! Incerc si eu sa invat programarea dinamica,dar nu am gasit pe net ceva din care sa pot intelege calumea.M-am uitat peste tutorialul de pe topcoder am inteles cat de cat in afara de partea cu grafuri(care nu le stiu pentru ca nu cred ca trebuie la olimpiada la a X-a),m-am uitat si peste rezolvarea la problema rucsacului de pe infoarena,dar cand incerc sa fac probleme cu programare dinamica nu am nici o idee.....:|
Ma puteti ajuta sa-mi explicati mai bine programarea dinamica si eventual sa-mi dati ceva probleme(pt. incepatori) sa rezolv ?? Edited by Mitza444, 02 September 2011 - 20:59. |
#2
Posted 03 September 2011 - 00:39
Nu exista un algoritm universal, ci mai degraba un mod de gandire. Ia cartea Emanuelei Cerchez, "Programarea in limbajul C/C++ pentru liceu", Editura Polirom, volumul 2, o buna parte e despre programarea dinamica, poate te ajuta mai mult decat te poate ajute cineva pe forum.
|
#3
Posted 03 September 2011 - 08:16
Programarea dinamica poate fi considerata cea mai grea metoda de programare. Cum am mai zis, ea presupune sa poti sa abstractizezi problema, sa o imparti in subprobleme pe care le rezolvi independent si le combini dupa o formula/o anumita logca pentru a obtine raspunsul. Cum a zis si @edy_3dz nu exista un anumit tipar, trebuie doar multa munca pentru a-ti da seama cum se pune problema. Acea problema a rucsacului se rezolva ca si prima problema prezentata in tutorialul de pe topcoder. Uite niste probleme de dinamica pentru incepator ( logic ca unele problemele se pot rezolva, poate mai simplu, si fara programare dinamica ) :
http://infoarena.ro/problema/scmax http://community.top...l...ent&pm=1259 http://community.top...l...402&rd=5009 http://infoarena.ro/problema/ssm http://infoarena.ro/problema/podm http://community.top...l...918&rd=5006 http://infoarena.ro/problema/stirling http://campion.edu.r...g...de&id=32752 http://campion.edu.r...g...de&id=27129 http://campion.edu.r...g...view&id=513 http://campion.edu.r...g...view&id=793 http://campion.edu.r...g...view&id=344 http://campion.edu.r...g...view&id=485 http://campion.edu.r...g...view&id=599 http://campion.edu.r...g...iew&id=1240 http://campion.edu.r...g...iew&id=1079 http://fiicompetitio...t_viena_2_3.pdf http://fiicompetitio..._sablon_2_4.pdf http://infoarena.ro/problema/cmlsc http://infoarena.ro/problema/rmq http://infoarena.ro/problema/lca http://infoarena.ro/problema/hamilton |
#4
Posted 03 September 2011 - 21:19
Am incercat sa rezolv problema pachete de pe .campion si am gasit o recurenta ,dar nu e chiar buna pt. ca la unele teste cum ar fi exemplul 2 nu merge.......
Va puteti uita un pic peste cod sau sa-mi dati niste indicatii cum sa fac problema:D #include<cstdio> using namespace std; int max(int a, int { if(a>b)return a; return b; } int min[100001],d[100001],i[100001]; int main(){ int n,k; FILE * pFile; pFile=fopen("pachete.in","r"); fscanf(pFile,"%d",&n); for(k=1;k<=n;k++){ fscanf(pFile,"%d%d",&i[k],&d[k]); } for(k=1;k<=n;k++){ min[k]=d[k]+max(0,min[k-1]-i[k]); } pFile=fopen("pachete.out","w"); fprintf(pFile,"%d",min[n]); return 0; } Secretalex92 mai poti pune o data linku de la primele 2 probleme de pe .campion pt. ca atunci cand dai click pe link imi intra pe campion si imi da "eroare acces interzis"...... |
#5
Posted 04 September 2011 - 11:37
Mda am reusit pana la urma sa rezolv problema de 100p dar nu stiu sigur daca am folosit programare dinamica
Va puteti uita peste cod sa-mi ziceti daca e programare dinamica sau nu si daca nu e cum as putea face cu programare dinamica?? #include<cstdio> using namespace std; int max(int a, int { if(a>b)return a; return b; } int d[100001],i[100001]; int main(){ int n,k,dif,min; FILE * pFile; pFile=fopen("pachete.in","r"); fscanf(pFile,"%d",&n); for(k=1;k<=n;k++){ fscanf(pFile,"%d%d",&i[k],&d[k]); } min=d[1]; for(k=2;k<=n;k++){ dif=d[k]-i[k-1]; min=min+max(0,dif); if(dif<0)i[k]=i[k]-dif; } pFile=fopen("pachete.out","w"); fprintf(pFile,"%d",min); return 0; } |
#6
Posted 04 September 2011 - 15:34
#7
Posted 05 September 2011 - 10:38
Imi puteti spune de ce imi da ciclu infinit si dupa aceea eroare??problema este lacusta de pe .campion
#include<cstdio> using namespace std; int A[101][101],B[101][101]; int main(){ int m,n,i,j,x,y,x1,y1,min; FILE * pFile; pFile=fopen("lacusta.in","r"); fscanf(pFile,"%d%d",&m,&n); for(i=1;i<=m;i++){ for(j=1;j<=n;j++){ fscanf(pFile,"%d",A[i][j]); } } B[2][1]=99999; min=99999; for(i=2;i<=n;i++){ B[2][i]=A[1][1]+A[1][i]+A[2][i]; if(B[2][i]<min){x=2;y=i;min=B[2][i];} } for(i=3;i<=m;i++){ min=99999; for(j=1;j<=n;j++){ if(y!=j){ B[i][j]=A[i-1][j]+A[i][j]+B[x][y]; if(B[i][j]<min){min=B[i][j];x1=i;y1=j;} } } x=x1;y=y1; } pFile=fopen("lacusta.out","w"); fprintf(pFile,"%d",B[x][y]); return 0; } |
#8
Posted 06 September 2011 - 08:03
#9
Posted 07 September 2011 - 11:19
Mda ai avut dreptate a trebuit sa iau si cazul y==j
Dar am o alta intrebare la problema jucarii de pe .campion.. Eu m-am gandit asa sa fac un backtracking recursiv care imi genereaza toate solutiile in ordine lexicografica si la fiecare solutie pe care o gasesc sa fac verificarea daca are un subsir crescator de cel putin k elemente si de fiecare data cand gasesc un astfel de sir cresc o variabila care cand este egala cu p afisez solutia. Problema e ca nu cred ca am facut bine functia care determina subsirul crescator + imi pica la timpul de executie la un test si la unul iau killed by signal 11 :| Cum as puteam face determina subsirului in alt mod mai eficient?? Aici e codul: #include<cstdio> using namespace std; int a[12],b[12],k,p,nr=0; FILE * pFile; void dinamic(int l){ int s[13],j; s[1]=1; for(j=1;j<l;j++){ if(a[j]<a[j+1]){ s[j+1]=s[j]+1; } } if(s[l]>=k)nr++; pFile=fopen("jucarii.out","w"); if(nr==p){ for(j=1;j<=l;j++) fprintf(pFile,"%d ",a[j]); fprintf(pFile,"\n"); } } void back(int x,int len){ int i; if(x-1==len){ dinamic(len); } else { for(i=1;i<=len;i++){ if(!b[i]){ a[x]=i; b[i]=1; back(x+1,len); b[i]=0; } } } } int main(){ int n; pFile=fopen("jucarii.in","r"); fscanf(pFile,"%d%d%d",&n,&k,&p); back(1,n); return 0; } |
#10
Posted 07 September 2011 - 14:52
Da, nu ai rezolvat bine dinamica. Uite un teste pe care ar pica
1 2 -1 -1 -1 3 Raspuns corect : 1 2 3Vezi ca faci o confuzie intre subsecventa si subsir. Prima presupune ca elementele pe care le contine sa fie consecutive in sir, iar la subsir nu. Daca avem (xn), n natural nenul, atunci un subsir este xi, xj, xk, ... cu conditia ca 0<i<j<k<... <=n => elementele unui subsir nu sunt neaparat consecutive. |
|
#11
Posted 10 September 2011 - 20:50
1.Da ai avut dreptate nu era bine programarea dinamica am refacut-o si a mers....
2.La problema suma4 de pe .campion dupa ce determin numara de niveluri sa fac un for(i=1;i<=m;i++) si la fiecare pas sa pun nivelul respectiv in matrice(adica pun prima data 1 care are numai o casuta dupa pun nivelul 2 care are 4 casute si tot asa....) si la fiecare nivel sa adun minimum de pe nivelul anterior in cele 3 casute in care pot merge.Ar fi buna ideea?? |
#12
Posted 11 September 2011 - 13:27
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users