programarea dinamic ă. metoda îna poi problemă:

8
Programarea dinamică. Metoda înapoi Problemă: Se consideră o valoare naturală x şi un şir V crescător, ce conţine n elemente naturale. 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 : (V ik+1 – V ik ) ≥ 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 V i , 1≤ i ≤ n. ste 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].

Upload: autumn-koch

Post on 02-Jan-2016

15 views

Category:

Documents


0 download

DESCRIPTION

Programarea dinamic ă. Metoda îna poi Problemă: - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Programarea dinamic ă. Metoda îna poi Problemă:

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].

Page 2: Programarea dinamic ă. Metoda îna poi Problemă:

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

Page 3: Programarea dinamic ă. Metoda îna poi Problemă:

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

Page 4: Programarea dinamic ă. Metoda îna poi Problemă:

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

Page 5: Programarea dinamic ă. Metoda îna poi Problemă:

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

Page 6: Programarea dinamic ă. Metoda îna poi Problemă:

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

Page 7: Programarea dinamic ă. Metoda îna poi Problemă:

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.

Page 8: Programarea dinamic ă. Metoda îna poi Problemă:

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],' ');