programarea dinamic ă. metoda îna poi problemă:
DESCRIPTION
Programarea dinamic ă. Metoda îna poi Problemă: - PowerPoint PPT PresentationTRANSCRIPT
Programarea dinamică. Metoda înapoiProblemă: 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
5 7 9 10 14 15V=
1 0 0 0 0 0L=
X=4
7-5<x
1
deci max rămâne 0 iar L[2]=1+max=1
5 7 9 10 14 15V=
1 1 0 0 0 0L=
X=4
9-5=x 9-7<x
deci max =1 iar L[3]=1+max=2
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
5 7 9 10 14 15V=
1 1 2 0 0 0L=
X=4
10-5>x 10-7<x
deci max =1 iar L[4]=1+max=1+max=2
10-9<x
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
5 7 9 10 14 15V=
1 1 2 2 0 0L=
X=4
14-5>x 14-7>x
deci max =2 iar L[5]=1+max=3
14-9>x 14-10=x
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
5 7 9 10 14 15V=
1 1 2 2 0L=
X=4
15-5>x 15-7>x
deci max =2 iar L[6]=1+max=3
15-9>x 15-10>x
3
15-14<x
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
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
1 1 2 2L= 3 3
5 7 9 10 14 15V=
15105
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 PascalL[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],' ');