1 / 8

Programarea dinamic ă. Metoda îna poi Problemă:

Programarea dinamic ă. Metoda îna poi Problemă:

autumn-koch
Download Presentation

Programarea dinamic ă. Metoda îna poi Problemă:

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programarea dinamică. Metoda înapoi Problemă: Se consideră o valoare naturală x şi un şir V crescător, ce conţine n elemente naturale. Să se realizeze un program care determină un subşir de lungime maximă, în care diferenţa între oricare două elemente alăturate este mai mare sau egală cu x : (Vik+1 – Vik ) ≥ x, 1 ≤ ik < n. Exemplu : Pentru n=6, x=4 şi şirul V= (5, 7, 9, 10, 14, 15) | Se va afişa 5, 9, 14 ; 5, 10, 15  sau 5, 10, 14. În cazul problemei de faţă o subproblemă se referă la determinarea unui subşir de lungime maximă care respectă condiţia impusăşi care se termină cu elementul Vi, 1≤ i ≤ n. V este vectorul care reţine şirul iniţial: 5 7 9 10 14 15 Vectorul L va memora în L[i] lungimea celui mai lung subşir, al cărui ultim element este V[i].

  2. Relaţiile de recurenţă sunt urmatoarele: L[1] = 1 ; L[i] = 1+max{ L[j] | V[i]-V[j] ≥ x, j < i ≤ n} Lungimea celui mai lung subşir care se termină cu V[i] este mai mare cu 1 decât lungimea maximă a unui subşir care se termină cu un element V[j] | V[i]-V[j] ≥ x X=4 V= 5 7 9 10 14 15 L= 1 1 0 0 0 0 0 7-5<x deci max rămâne 0 iar L[2]=1+max=1

  3. Relaţiile de recurenţă sunt urmatoarele: L[1] = 1 ; L[i] = 1+max{ L[j] | V[i]-V[j] ≥ x, j < i ≤ n} Lungimea celui mai lung subşir care se termină cu V[i] este mai mare cu 1 decât lungimea maximă a unui subşir care se termină cu un element V[j] | V[i]-V[j] ≥ x X=4 V= 5 7 9 10 14 15 L= 1 1 2 0 0 0 0 9-5=x 9-7<x deci max =1 iar L[3]=1+max=2

  4. Relaţiile de recurenţă sunt urmatoarele: L[1] = 1 ; L[i] = 1+max{ L[j] | V[i]-V[j] ≥ x, j < i ≤ n} Lungimea celui mai lung subşir care se termină cu V[i] este mai mare cu 1 decât lungimea maximă a unui subşir care se termină cu un element V[j] | V[i]-V[j] ≥ x X=4 V= 5 7 9 10 14 15 L= 1 1 2 2 0 0 0 10-5>x 10-7<x 10-9<x deci max =1 iar L[4]=1+max=1+max=2

  5. Relaţiile de recurenţă sunt urmatoarele: L[1] = 1 ; L[i] = 1+max{ L[j] | V[i]-V[j] ≥ x, j < i ≤ n} Lungimea celui mai lung subşir care se termină cu V[i] este mai mare cu 1 decât lungimea maximă a unui subşir care se termină cu un element V[j] | V[i]-V[j] ≥ x X=4 V= 5 7 9 10 14 15 L= 1 1 2 2 3 0 0 14-5>x 14-7>x 14-9>x 14-10=x deci max =2 iar L[5]=1+max=3

  6. Relaţiile de recurenţă sunt urmatoarele: L[1] = 1 ; L[i] = 1+max{ L[j] | V[i]-V[j] ≥ x, j < i ≤ n} Lungimea celui mai lung subşir care se termină cu V[i] este mai mare cu 1 decât lungimea maximă a unui subşir care se termină cu un element V[j] | V[i]-V[j] ≥ x X=4 V= 5 7 9 10 14 15 L= 1 1 2 2 3 3 0 15-5>x 15-7>x 15-9>x 15-10>x 15-14<x deci max =2 iar L[6]=1+max=3

  7. După aceasta se calculează maximul dintre elementele lui L, iar cel mai lung subşir din V care îndeplineşte condiţiile problemei va avea lungimea dată de acest maxim. Pentru a lista acest subşir se procedează astfel: • Se caută maximul din L precum şi indicele p la care se găseşte acest maxim • Se afişează V[p] • Se găseşte şi se listează primul element V[i] l V[p]-V[i]>=x şi are lungimea mai mică cu 1 faţă de max (max-1). Se actualizează max cu max-1 şi p cu indicele curent. • Algoritmul continuă până când se epuizează toate elementele şirului V= 5 7 9 10 14 15 L= 1 1 2 2 3 3 5 10 15 Pentru a afişa crescător elementele subşirului se reţin elementele lui într-un vector auxiliar (de exemplu W) sau se scrie o procedură recursivă care reface drumul parcurs.

  8. Implementarea problemei în Pascal L[1]:=1; for i:=2 to n do begin max:=0; for j:=1 to i-1 do if (V[i]-V[j]>=x)and(L[j]>max) then max:=L[j]; L[i]:=1+max; end; max:=0; for i:=1 to n do if L[i]>max then begin max:=L[i]; p:=i; end; m:=1;W[m]:=V[p]; max:=max-1; for i:=p-1 downto 1 do if (v[p]-v[i]>=x)and(L[i]=max) then begin m:=m+1; W[m]:=V[i]; max:=max-1; p:=i; end; for i:=m downto 1 do write(W[i],' ');

More Related