Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: cel mai mare cmlsc  (Citit de 1847 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
cristi8
Vizitator
« : Ianuarie 24, 2006, 21:39:57 »

fie A multimea celor mai lungi subsiruri comune dintre 2 siruri.
cum determin cel mai mare (in ordine lexicografica) element din A ?

s-a dat la OJI 2002, clasa 10a. (problema COD)
 Brick wall
1 <= n,m <= 200
..eu de-abia am scos un program functional de complexitate O(n^3) care nici nu l-am demonstrat (de obosit si lenes ce sunt), dar se pare ca trece toate testele.
se poate mai repede ?
voi cum faceti ?
Memorat
silviug
Echipa infoarena
Nu mai tace
*****

Karma: 193
Deconectat Deconectat

Mesaje: 485



Vezi Profilul
« Răspunde #1 : Ianuarie 24, 2006, 22:46:23 »

Se face algoritmul clasic de CLSC - O(N^2) - vezi Cormen. Sa-l determini pe cel mai mic (in cazul problemei de fata) faci dinamica invers: de la sfarsitul sirurilor catre inceputul lor. Asta iti va permite sa faci decizii astfel incat sa-l scoti pe cel minim. Daca mai vrei detalii mai posteaza, dar gandeste-te .. tre sa iasa Smile

Spor la treaba!
Memorat

"Don't gain the world and lose your soul, wisdom is better than silver or gold." [Bob Marley - Jamaican reggae musician & singer (1945 - 1981)]
andreit1
Vizitator
« Răspunde #2 : Ianuarie 24, 2006, 22:50:35 »

Nu pare foarte greu in O(n^2). Faci un cmlsc de la coada fiecarui sir si apoi cauti cand reconstituiesti sa ai cea mai mare litera posibila la fiecare pas. Nu ar trebui sa puna probleme...
[later edit] Vad ca a postat Silviu in timp ce scriam eu. Daca apare vrun moderator sa imi stearga si mie postul...
Memorat
cristi8
Vizitator
« Răspunde #3 : Ianuarie 24, 2006, 22:56:44 »

invers am facut dinamica oricum, sa am la sfarsit cele mai semnificative valori.

eu am zis ca nu stii unde sa te duci cand reconstitui solutia astfel incat sa o obtii pe cea mai mare lexicografic.

sa zicem ca c[0][0] = 5 (lungimea lui).
si a[0] != b[0] (nu e litera comuna pe prima pozitie).
si c[0][1] = c[1][0] = 5.

unde te duci ? in (0,1) sau (1,0) ? poate nici acolo nu e litera comuna, dar tot mergand, in final se ajunge la 2 LCS-uri egale ca lungime, dar unul mai mic ca celalalt.


eu cand am construit c[j], cand
a != b[j] si c[i+1][j] == c[j+1], am verificat ordinea lexicografica a celor 2 subsiruri (O(n), retinand si tatii in alte 2 matrici)
Memorat
silviug
Echipa infoarena
Nu mai tace
*****

Karma: 193
Deconectat Deconectat

Mesaje: 485



Vezi Profilul
« Răspunde #4 : Ianuarie 25, 2006, 00:07:37 »

Nu mai stiu exact ce faceam.. dar probabil daca tii pentru fiecare pozitie in matricea de reconstituire si cel mai mic tata (prima litera comuna la care ajungi luand-o pe acolo) e de ajuns, din moment ce tu iei cifrele in ordine, de la ce mai semnificativa la cea mai putin semnificativa.

Vei obiecta spunand ca si tatii pot fi egali si atunci ce faci ? Intuitia imi spune ca atunci poti lua orice decizie ca tot acolo ajungi la un moment dat Smile

Incearca asa.. poate merge

Silviu
 Thumb up
Memorat

"Don't gain the world and lose your soul, wisdom is better than silver or gold." [Bob Marley - Jamaican reggae musician & singer (1945 - 1981)]
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines