Metody programowania / Ćwiczenia 6: Różnice pomiędzy wersjami
Nie podano opisu zmian |
|||
(Nie pokazano 2 pośrednich wersji utworzonych przez tego samego użytkownika) | |||
Linia 10: | Linia 10: | ||
Dana jest tablica A zawierająca posortowane rosnąco liczby rzeczywiste oznaczające współrzędne punktów na prostej. Oblicz maksymalną sumę długości rozłącznych odcinków (tzn. nie stykających się nawet końcami), które można otrzymać łącząc wybrane sąsiednie punkty. Nie ma obowiązku użycia wszystkich punktów i nie wolno zmieniać zawartości tablicy. | Dana jest tablica A zawierająca posortowane rosnąco liczby rzeczywiste oznaczające współrzędne punktów na prostej. Oblicz maksymalną sumę długości rozłącznych odcinków (tzn. nie stykających się nawet końcami), które można otrzymać łącząc wybrane sąsiednie punkty. Nie ma obowiązku użycia wszystkich punktów i nie wolno zmieniać zawartości tablicy. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Przeglądaj A od lewej od prawej, pamiętając dwie liczby: najlepszą sumę używającą ostatniego punktu i najlepszą sumę nieużywającą ostatniego punktu. | Przeglądaj A od lewej od prawej, pamiętając dwie liczby: najlepszą sumę używającą ostatniego punktu i najlepszą sumę nieużywającą ostatniego punktu. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''function''' Odcinki(N:integer; '''var''' A:'''array'''[1..N] '''of''' real) : real; | '''function''' Odcinki(N:integer; '''var''' A:'''array'''[1..N] '''of''' real) : real; | ||
// N>=0; A posortowana | // N>=0; A posortowana | ||
Linia 54: | Linia 57: | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''function''' Odcinki2(N:integer; '''var''' A:'''array'''[1..N] '''of''' real) : real; | '''function''' Odcinki2(N:integer; '''var''' A:'''array'''[1..N] '''of''' real) : real; | ||
// N>=0; A posortowana | // N>=0; A posortowana | ||
Linia 91: | Linia 95: | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Ćwiczenie</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Jak zmodyfikować nasz program, aby zamiast liczenia maksymalnej sumy, wypisywał ciąg odcinków o maksymalnej sumie? | Jak zmodyfikować nasz program, aby zamiast liczenia maksymalnej sumy, wypisywał ciąg odcinków o maksymalnej sumie? | ||
</div> | </div> | ||
</div> | </div> | ||
==Zadanie 2 (Kwadrat)== | ==Zadanie 2 (Kwadrat)== | ||
Dana jest tablica A typu array[1..N,1..M] of integer. Oblicz rozmiar (długość boku) największego kwadratu w tej tablicy składającego się z samych zer. | Dana jest tablica A typu array[1..N,1..M] of integer. Oblicz rozmiar (długość boku) największego kwadratu w tej tablicy składającego się z samych zer. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
W pomocniczej tablicy B tego samego typu trzymamy rozmiary największych kwadratów składających się z zer o prawym dolnym rogu w A[i,j]. Jeśli A[i,j]=0 to licząc B[i,j] patrzymy na B[i-1,j] i B[i,j-1] (oczywiście uważając na brzegi). W przypadku gdy B[i-1,j]=B[i, j-1]=r trzeba jeszcze zbadać A[i-r,j-r]. | W pomocniczej tablicy B tego samego typu trzymamy rozmiary największych kwadratów składających się z zer o prawym dolnym rogu w A[i,j]. Jeśli A[i,j]=0 to licząc B[i,j] patrzymy na B[i-1,j] i B[i,j-1] (oczywiście uważając na brzegi). W przypadku gdy B[i-1,j]=B[i, j-1]=r trzeba jeszcze zbadać A[i-r,j-r]. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''function''' MaksKwadrat(N,M:integer; '''var''' A:'''array'''[1..N,1..M] '''of''' integer) : integer; | '''function''' MaksKwadrat(N,M:integer; '''var''' A:'''array'''[1..N,1..M] '''of''' integer) : integer; | ||
// N, M >=0; szukamy długości boku największego kwadratu w A składającego się z samych zer | // N, M >=0; szukamy długości boku największego kwadratu w A składającego się z samych zer | ||
Linia 147: | Linia 154: | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Ponieważ nidgy nie sięgamy więcej niż o jeden wiersz w górę (i nigdy w prawo) wystarczy pomocnicza tablica B typu array [0..N] of integer (gdzie B[0]=0). | Ponieważ nidgy nie sięgamy więcej niż o jeden wiersz w górę (i nigdy w prawo) wystarczy pomocnicza tablica B typu array [0..N] of integer (gdzie B[0]=0). | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
'''function''' MaksKwadrat2(N,M:integer; '''var''' A:'''array'''[1..N,1..M] '''of''' integer) : integer; | '''function''' MaksKwadrat2(N,M:integer; '''var''' A:'''array'''[1..N,1..M] '''of''' integer) : integer; | ||
// N, M >=0; szukamy długości boku największego kwadratu w A składającego się z samych zer | // N, M >=0; szukamy długości boku największego kwadratu w A składającego się z samych zer | ||
Linia 190: | Linia 199: | ||
</div> | </div> | ||
</div> | </div> | ||
==Zadanie 3 (Prostokąt)== | ==Zadanie 3 (Prostokąt)== | ||
Dana jest tablica A typu array[1..N,1..M] of integer. Oblicz maksymalne pole prostokąta składającego się z samych zer w tej tablicy. | Dana jest tablica A typu array[1..N,1..M] of integer. Oblicz maksymalne pole prostokąta składającego się z samych zer w tej tablicy. | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 1</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
Ponieważ prostokątów zaczepionych prawym dolnym rogiem w danym polu może być dużo i nie bardzo wiadomo który z nich zapamiętać, rozwiązanie zadania z kwadratami nie przenosi sie bezpośrednio na zadanie o prostokątach. | Ponieważ prostokątów zaczepionych prawym dolnym rogiem w danym polu może być dużo i nie bardzo wiadomo który z nich zapamiętać, rozwiązanie zadania z kwadratami nie przenosi sie bezpośrednio na zadanie o prostokątach. | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka 2</span> | |||
<div class="mw-collapsible-content" style="display:none"> | |||
W pomocniczej tablicy B należy trzymać wysokość najdłuższego słupka zer w A o dolnym końcu w A[i,j]. W celu obliczenia maksymalnego pola prostokąta zaczepionego w A[i,j] należy przechodzić tablicę B indeksem r od prawej do lewej zaczynając od i, i obliczać maksymalne pola prostokątów o podstawie A[i-r,j] A[i,j]. | W pomocniczej tablicy B należy trzymać wysokość najdłuższego słupka zer w A o dolnym końcu w A[i,j]. W celu obliczenia maksymalnego pola prostokąta zaczepionego w A[i,j] należy przechodzić tablicę B indeksem r od prawej do lewej zaczynając od i, i obliczać maksymalne pola prostokątów o podstawie A[i-r,j] A[i,j]. | ||
Linia 207: | Linia 219: | ||
</div> | </div> | ||
</div> | </div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"> | |||
<span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie</span><div class="mw-collapsible-content" style="display:none"> | |||
'''function''' MaksProstokąt(N,M:integer; '''var''' A:'''array'''[1..N,1..M] '''of''' integer) : integer; | '''function''' MaksProstokąt(N,M:integer; '''var''' A:'''array'''[1..N,1..M] '''of''' integer) : integer; | ||
// N, M >=0; szukamy maksymalnego pola prostokąta w A składającego się z samych zer | // N, M >=0; szukamy maksymalnego pola prostokąta w A składającego się z samych zer | ||
Linia 247: | Linia 259: | ||
</div> | </div> | ||
</div> | </div> | ||
Aktualna wersja na dzień 22:15, 28 maj 2020
Zadania z programowania dynamicznego.
Oglądaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__
Zadanie 1 (Odcinki)
Dana jest tablica A zawierająca posortowane rosnąco liczby rzeczywiste oznaczające współrzędne punktów na prostej. Oblicz maksymalną sumę długości rozłącznych odcinków (tzn. nie stykających się nawet końcami), które można otrzymać łącząc wybrane sąsiednie punkty. Nie ma obowiązku użycia wszystkich punktów i nie wolno zmieniać zawartości tablicy.
Wskazówka
Rozwiązanie
Rozwiązanie 2
Ćwiczenie
Zadanie 2 (Kwadrat)
Dana jest tablica A typu array[1..N,1..M] of integer. Oblicz rozmiar (długość boku) największego kwadratu w tej tablicy składającego się z samych zer.
Wskazówka 1
Rozwiązanie 1
Wskazówka 2
Rozwiązanie 2
Zadanie 3 (Prostokąt)
Dana jest tablica A typu array[1..N,1..M] of integer. Oblicz maksymalne pole prostokąta składającego się z samych zer w tej tablicy.
Wskazówka 1
Wskazówka 2