80 likes | 137 Views
Programarea dinamic ă. Metoda îna poi Problemă:
E N D
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].
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
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
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
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
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
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.
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],' ');