•Cosmin
|
 |
« : Aprilie 12, 2006, 15:50:09 » |
|
Aici puteţi discuta despre problema BMatrix.
|
|
|
Memorat
|
|
|
|
•Marius
|
 |
« Răspunde #1 : Iulie 15, 2006, 09:51:52 » |
|
Ce idei aveti ? (legate de problema  ) 
|
|
|
Memorat
|
Faceti lucrurile simplu: pe cat de simplu posibil, dar nu mai simplu.
|
|
|
u-92
Vizitator
|
 |
« Răspunde #2 : Iulie 15, 2006, 10:51:51 » |
|
problema e de idee.. vezi cum poti pune cele 2 dreptunghiuri.. daca vrei ceva mai consistent cauta in "task and solutions" de la ioi2005
|
|
|
Memorat
|
|
|
|
•Cosmin
|
 |
« Răspunde #3 : Iulie 15, 2006, 11:04:43 » |
|
Cele doua dreptunghiuri care nu se suprapun vor putea fi separate printr-o linie orizontala sau printr-o linie verticala. Si acum pt fiecare pozitionare posibila a liniei de separare ai ajuns la problema mai simpla de determinare a unui dreptunghi maxim gol. Problema asta este clasica si se poate rezolva in mai multe moduril, cele mai des folosite fiind cel in O(n^3) si O(n^2). Daca esti atent poti face o rezolvare in O(n^3) sau O(n^2) in total.
|
|
|
Memorat
|
|
|
|
•pauldb
|
 |
« Răspunde #4 : August 13, 2006, 12:01:41 » |
|
Este ceva deosebit la testul 19?  [iau WA]. [Peste tot in problema folosesc longint si matricile le-am indexat de la 0..300]. Cred ca trebuie sa fie altceva. 
|
|
|
Memorat
|
Am zis 
|
|
|
•devilkind
|
 |
« Răspunde #5 : Februarie 27, 2007, 15:28:18 » |
|
stie vreo cineva care e faza cu testu 9?? e vreun caz particular ceva?? iau 95 cu WA pe acest test si nu inteleg de ce  . Am facut un algoritm care ruleaza in n^3.
|
|
« Ultima modificare: Februarie 27, 2007, 16:29:39 de către Savin Tiberiu »
|
Memorat
|
|
|
|
•fireatmyself
|
 |
« Răspunde #6 : Februarie 27, 2007, 18:14:22 » |
|
in: 5 12 111110011111 111100111111 111010111011 111110101111 111110111101
6 13 1111111111111 1100101101010 1101011111111 1101101111111 1101001110111 1111111110111
9 14 11111111100111 11111111100111 10101111111111 11011111111111 11111111111111 11111100111111 11101110111111 11010011111111 11111111111011
20 20 11001111011111111011 11001111110111110111 11001101111011101111 11001111111101011111 10001111111110111111 11001111111111111111 11111111111111111101 11111110000111111111 11111111111111111111 11111111111111001111 11111111111111001111 11000000011111111111 11111111111111110111 11000000011111111111 11111111111111111111 11111111111011111111 11110001001000111111 11111111111111110111 11111110001111111111 11111111111111110111 out: sper ca n-am busit ceva 
|
|
|
Memorat
|
Viata e scurta. Daca nu o putem lungi, macar s-o facem lata.
|
|
|
•devilkind
|
 |
« Răspunde #7 : Februarie 27, 2007, 18:31:50 » |
|
Am luat 100 dar totusi nu prea inteleg ce era gresit. adik pe testele puse de tine obtineam aceleasi rezultate doar ca am facut o modifiacare care nu afecta codul (dupa parerea mea deloc) si am luat 100. Adica eu pana acum nu am luat in considerare si acoperirea cu un singur dreptunghi.
|
|
« Ultima modificare: Februarie 27, 2007, 18:39:09 de către Savin Tiberiu »
|
Memorat
|
|
|
|
•fireatmyself
|
 |
« Răspunde #8 : Februarie 27, 2007, 18:40:18 » |
|
pai nu e bine, pentru ca tu trebuia sa determini aria maxima pe care o acopera exact doua dreptunghiuri, nu cel mult doua dreptunghiuri
|
|
« Ultima modificare: Februarie 27, 2007, 18:42:48 de către Bogdan Tataroiu »
|
Memorat
|
Viata e scurta. Daca nu o putem lungi, macar s-o facem lata.
|
|
|
•devilkind
|
 |
« Răspunde #9 : Februarie 27, 2007, 19:04:04 » |
|
tocmai de aia nu inteleg nici eu de ce luam doar 95 pana akuma. Sunteti siguri ca testu 9 e corect??
|
|
|
Memorat
|
|
|
|
•fireatmyself
|
 |
« Răspunde #10 : Februarie 27, 2007, 19:10:30 » |
|
da, suntem siguri. ideea este ca daca exista un singur dreptunghi de 0 (vezi exemplul de mai jos) acesta se poate imparti in doua dreptunghiuri (exista mai multe moduri pentru a o face, dar aria ramane tot cea a dreptunghiului initial). poate nu tratai cum trebuie acest caz. explicatie: o solutie posibila ar fi sa consideri primul dreptunghi format din casutele (2, 2) si (3, 2), iar al doilea dreptunghi format din casutele (2, 3), (2, 4), (3, 3), respectiv (3, 4). o alta solutie ar fi sa consideri dreptunghiul format din casutele (2, 2), (2, 3), respectiv (2, 4) si dreptunghiul format din casutele (3, 2), (3, 3), respectiv (3, 4). in ambele cazuri raspunsul este 6.
|
|
« Ultima modificare: Februarie 27, 2007, 19:16:07 de către Bogdan A. Stoica »
|
Memorat
|
Viata e scurta. Daca nu o putem lungi, macar s-o facem lata.
|
|
|
•savim
|
 |
« Răspunde #11 : Mai 03, 2008, 09:14:25 » |
|
Problema merge O ( N ^ 3)? Am incercat o astfel de dinamica si iau 90p (TLE pe ultimile doua). Si daca nu merge, puteti sa-mi dati un hint pentru O( N ^ 2) ? 
|
|
|
Memorat
|
|
|
|
•pauldb
|
 |
« Răspunde #12 : Mai 04, 2008, 22:19:00 » |
|
Incearca sa folosesti doar O(N^2) memorie.
|
|
|
Memorat
|
Am zis 
|
|
|
•wefgef
|
 |
« Răspunde #13 : Mai 04, 2008, 22:31:21 » |
|
Problema se poate face si in O(N^2). Stii sa faci submatricea de suma maxima in O(N^2)?
|
|
|
Memorat
|
omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
|
|
|
•Cosmin
|
 |
« Răspunde #14 : Mai 05, 2008, 01:36:00 » |
|
Andrei daca stii sa faci submatricea de suma maxima in O(n^2) atunci poti sa scrii un research paper. Cel mai bun algoritm cunoscut are complexitate putin mai mica decat O(n^3).
Probabil tu te refereai la submatricea maxima plina de 0.
|
|
|
Memorat
|
|
|
|
•wefgef
|
 |
« Răspunde #15 : Mai 05, 2008, 08:29:10 » |
|
 ), Da la submatricea maxima plina de 0 ma refeream  .
|
|
« Ultima modificare: Mai 05, 2008, 11:55:59 de către Adrian Diaconu »
|
Memorat
|
omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
|
|
|
•savim
|
 |
« Răspunde #16 : Mai 05, 2008, 12:09:34 » |
|
Nu, stiu doar O ( N ^ 3). O sa incerc sa optimizez memoria cum a zis Paul, sa vad cat iau. Daca nu merge asa, o sa ma gandesc la O (N ^ 2). L.E.: Am reusit sa iau suta  , modificand ordinea unor foruri, si micsorand tipul variabilelor. Pana la urma nu a trebuit sa tin ultimele doua linii din dinamica, oricum multumesc de sfaturi!
|
|
« Ultima modificare: Mai 05, 2008, 18:04:41 de către Stan Serban Andrei »
|
Memorat
|
|
|
|
•Dastas
|
 |
« Răspunde #17 : Mai 06, 2008, 13:01:04 » |
|
Eu sunt foarte curios cum se face submatrice maxima plina de zerouri in O(n 2)... as fi recunoscator daca ar explica cineva ideea  .
|
|
|
Memorat
|
|
|
|
•pauldb
|
 |
« Răspunde #18 : Mai 06, 2008, 20:04:10 » |
|
Initial calculezi A[i,j] = numarul de 0 consecutivi deasupra pozitiei i, j. Apoi parcurgi linie cu linie matricea si iti propui sa afli cel mai mare dreptunghi plin cu 0 deasupra liniei i (linia curenta). Parcurgi linia de la stanga la dreapta si adaugi valorile A[i,j] intr-o stiva. Cat timp elementul din stiva este mai mare decat elementul curent acesta este scos. Vezi daca varful stivei * (pozitia curenta - pozitia in care a fost varful adaugat in stiva) este mai bun ca solutia si actualizezi. Reiei apoi acelasi algoritm pe linie de la dreapta la stanga si in final vei obtine cel mai bun dreptunghi deasupra liniei i. De mentionat ca cu acest algoritm, nu poti (cel putin nu stiu eu cum) afla cel mai mare dreptunghi cu 0 cu coltul in (i, j).
Ma gandesc dreptunghiul si patratul maxim de 0 sunt dinamici care ar trebui adaugate in arhiva educationala pe viitor. Buru, modifici tu pagina?
|
|
|
Memorat
|
Am zis 
|
|
|
•bogdan2412
|
 |
« Răspunde #19 : Octombrie 11, 2009, 14:54:56 » |
|
S-au schimbat o parte din teste de la aceasta problema pentru a pica solutiile incorecte care luau 100 de puncte si s-au reevaluat toate sursele trimise pana acum.
|
|
|
Memorat
|
|
|
|
•APOCALYPTO
|
 |
« Răspunde #20 : Ianuarie 26, 2010, 19:43:26 » |
|
Initial calculezi A[i,j] = numarul de 0 consecutivi deasupra pozitiei i, j. Apoi parcurgi linie cu linie matricea si iti propui sa afli cel mai mare dreptunghi plin cu 0 deasupra liniei i (linia curenta). Parcurgi linia de la stanga la dreapta si adaugi valorile A[i,j] intr-o stiva. Cat timp elementul din stiva este mai mare decat elementul curent acesta este scos. Vezi daca varful stivei * (pozitia curenta - pozitia in care a fost varful adaugat in stiva) este mai bun ca solutia si actualizezi. Reiei apoi acelasi algoritm pe linie de la dreapta la stanga si in final vei obtine cel mai bun dreptunghi deasupra liniei i. De mentionat ca cu acest algoritm, nu poti (cel putin nu stiu eu cum) afla cel mai mare dreptunghi cu 0 cu coltul in (i, j).
Ma gandesc dreptunghiul si patratul maxim de 0 sunt dinamici care ar trebui adaugate in arhiva educationala pe viitor. Buru, modifici tu pagina?
Cine e acesta acesta? Elementul din varful stivei? Cum se introduc valori in stiva? Pe parcursul parcurgerii liniei i sau imediat ce trecem la linie noua introducem toate elementele liniei respective in stiva? Cand incepem sa parcurgem de la dreapta la stanga linia i se va intampla ceva cu stiva? Elementel vor ramane la fel ca atunci cand am terminat de parcurs de la stanga la dreapta? Din ce vom obtine cel mai bun dreptunghi de deasupra liniei i? In stiva? Multumesc anticipat pentru raspunsuri!
|
|
|
Memorat
|
|
|
|
•pauldb
|
 |
« Răspunde #21 : Ianuarie 26, 2010, 20:47:22 » |
|
Voi detalia mai mult solutia de mai sus pentru ca nu e completa si nici in totalitate corecta.
Calculezi A[i,j] = numarul de 0 consecutivi deasupra pozitiei (i,j). Apoi fixam o linie i si ne propunem sa calculam dreptunghiul de arie maxima plin cu 0 care are latura de jos pe linia i. Pentru a atinge acest scop, vom calcula pentru fiecare coloana j, care este latimea maxima a unui dreptunghi plin cu 0 care are inaltimea A[i,j]. Adica ne dorim mai exact sa calculam acel j' < j maxim astfel incat A[i,j'] < A[i,j] si acel j''>j minim astfel incat A[i,j'']<A[i,j]. Este evident ca daca stim pe j' si j'' baza dreptunghiului de inaltime A[i,j] se intinde intre j'+1 si j''-1, deci latimea dreptunghiului este j''-1-j'. Astfel avem un candidat pentru marirea solutiei curente, de arie A[i,j]*(j''-1-j').
Mai trebuie sa vedem cum putem calcula j' si j'' pentru fiecare j. Mentionez ca j'' se obtine analog cu j', singura diferenta este ca linia i se parcurge de la dreapta la stanga pentru obtinerea lui. Pentru a afla j', vom parcurge coloanele de la stanga la dreapta si vom insera treptat intr-o stiva valorile A[i,j]. Vom mai folosi un vector suplimentar pentru a memora coloana cand a intrat o valoare in stiva. La fiecare pas eliminam varful stivei cat timp acesta este strict mai mare decat A[i,j]-ul curent. In continuare, daca A[i,j] este strict mai mare decat varful stivei, se introduce in stiva. Daca la pasul curent a fost eliminat cel putin un element din stiva, nu se modifica coloana de introducere pentru varful stivei chiar daca il introducem pe A[i,j]. Motivul este ca elementele eliminate au fost cu siguranta mai mari decat A[i,j] si deci dreptunghiul se poate intinde in urma. Altfel (daca nu a fost eliminat nici un element), coloana in care a fost introdus varful stivei se considera a fi j (deoarece coloana anterioara este de o inaltime strict mai mica). Astfel, pentru fiecare pozitie j, j'+1 = coloana pentru care a fost introdus varful stivei.
|
|
« Ultima modificare: Ianuarie 26, 2010, 21:00:47 de către Paul-Dan Baltescu »
|
Memorat
|
Am zis 
|
|
|
•wefgef
|
 |
« Răspunde #22 : Ianuarie 27, 2010, 12:32:13 » |
|
Solutia prezentata de tine initial este diferita (si mai rapida) de cea cu un post mai sus  . In schimb, este mai usor de inteles corectitudinea algoritmului cu doua parcurgeri.
|
|
|
Memorat
|
omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
|
|
|
•pauldb
|
 |
« Răspunde #23 : Ianuarie 27, 2010, 15:09:15 » |
|
Pai, acum cand ma gandesc, solutia de mai sus chiar nu mi se pare corecta (ma refer la fraza "Vezi daca varful stivei * (pozitia curenta - pozitia in care a fost varful adaugat in stiva) este mai bun ca solutia si actualizezi"). De exemplu, nu mi se pare ca acopera cazuri de genul: 01110 00100 00000 00000
Tu cum faci dintr-o singura parcurgere?
|
|
|
Memorat
|
Am zis 
|
|
|
•wefgef
|
 |
« Răspunde #24 : Ianuarie 27, 2010, 15:53:12 » |
|
Fac exact asa cum ai explicat tu. Uite o sursa: http://infoarena.ro/job_detail/312811?action=view-sourceMentin o stiva de perechi (inaltime, pozitie), sortate strict crescator dupa inaltime, care reprezinta candidatii pentru capatul din stanga al dreptunghiului de arie maxima. Pentru pasul i sa spunem ca ai inaltimea h. Vrei sa introduci in stiva. Daca h este mai mare decat varful stivei adaugi perechea (h, i). Altfel, scoti din stiva cat timp inaltimea din varf este mai mare strict decat h. Daca ramai in varf cu o inaltime egala cu h, nu faci nimic. Altfel adaugi perechea (h, j), unde j reprezinta ultima pozitie pe care ai sters-o din varful stivei. Stiva ar functiona astfel pe exemplul dat de tine: Pasul 1: (4, 1). Pasul 2: Scoti (4, 1), adaugi (3, 1). Stiva arata astfel: (3, 1). Pasul 3: Scoti (3, 1), adaugi (2, 1). Stiva arata astfel: (2, 1). Pasul 4: Adaugi (3, 4). Stiva arata astfel: (2, 1), (3, 4). Pasul 5: Adaugi (4, 5). Stiva arata astfel: (2, 1), (3, 4), (4, 5). Verficarile le fac atunci cand scot din stiva. La sfarsit am grija sa golesc de tot stiva, facand verificarile necesare.
|
|
|
Memorat
|
omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
|
|
|
|