Metody programowania / Ćwiczenia 6: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Daria (dyskusja | edycje)
Nie podano opisu zmian
Daria (dyskusja | edycje)
Zadania na kwadrat i prostokąt
Linia 103: Linia 103:


{{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
{{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><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]. Licząc B[i,j], jeśli A[i,j] jest zerem, 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>
Linia 109: Linia 109:


{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
  function MaksKwadrat(N: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
  var i,j,maks,r,bok : integer;
  var i,j,maks,r,bok : integer;
     B : array [1..N,1..M] of integer;
     B : array [1..N,1..M] of integer;
  begin
  begin
  maks:=0;                          //na maks będziemy pamiętać bok największego dotychczas napotkanego kwadratu
   for i:=1 to N do                  //wypełniamy pierwszy wiersz tablicy B
   for i:=1 to N do                  //wypełniamy pierwszy wiersz tablicy B
     if A[i,1]=0 then B[i,1]:=1
     if A[i,1]=0 then begin
      B[i,1]:=1
      maks:=1;
    end
     else B[i,1]:=0;
     else B[i,1]:=0;
   for j:=1 to M do                  //wypełniamy pierwszą kolumnę tablicy B
   for j:=1 to M do                  //wypełniamy pierwszą kolumnę tablicy B
     if A[1,j]=0 then B[1,j]:=1
     if A[1,j]=0 then begin
      B[1,j]:=1
      maks:=1;
    end
     else B[1,j]:=0;
     else B[1,j]:=0;
  maks:=0;                          //na maks będziemy pamiętać bok największego dotychczas napotkanego kwadratu
   for j:=2 to M do
   for j:=2 to M do
     for i:=2 to N do  
     for i:=2 to N do  
       if A[i,j]=0 then begin        //jeśli A[i,j]=0 to wartośc B[i,j] zależy od B[i-1,j] i B[i,j-1]
       if A[i,j]=0 then begin        //jeśli A[i,j]=0 to wartośc B[i,j] zależy od B[i-1,j] i B[i,j-1]
         r:=B[i,j-1];   
         r:=B[i,j-1];   
         if B[i-1,j]=r then                 //jeśli B[i-1,j]=B[i,j-1] to trzeba zbadać A[i-r,j-r]
         if B[i-1,j]=r then         //jeśli B[i-1,j]=B[i,j-1] to trzeba zbadać A[i-r,j-r]
           if A[i-r,j-r]=0 then bok:=r+1
           if A[i-r,j-r]=0 then bok:=r+1
           else bok:=r
           else bok:=r
Linia 145: Linia 151:


{{wskazowka| 2||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
{{wskazowka| 2||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><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 [1..N] of integer.
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>
Linia 151: Linia 157:


{{rozwiazanie| 2||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
{{rozwiazanie| 2||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
  function MaksKwadrat2(N: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
  var i,j,maks,r,bok : integer;
  var i,j,maks,r,bok,stareB : integer;
     B : array [1..N] of integer;
     B : array [0..N] of integer;
  begin
  begin
  maks:=0;                          //na maks będziemy pamiętać bok największego dotychczas napotkanego kwadratu
  B[0]:=0;
   for i:=1 to N do                  //wypełniamy tablicę B zgodnie z pierwszym wierszem A
   for i:=1 to N do                  //wypełniamy tablicę B zgodnie z pierwszym wierszem A
     if A[i,1]=0 then B[i]:=1
     if A[i,1]=0 then begin
      B[i]:=1
      maks:=1;
    end
     else B[i]:=0;
     else B[i]:=0;
  maks:=0;                          //na maks będziemy pamiętać bok największego dotychczas napotkanego kwadratu
   for j:=2 to M do                 //przechodzimy po kolejnych wierszach
   for j:=2 to M do begin
     for i:=1 to N do               //przechodzimy po kolejnych kolumnach
    stareB:=B[1];
       if A[i,j]=0 then begin        //jeśli A[i,j]=0 to wartośc B[i] zależy od B[i-1] i B[i]
    if A[1,j]=0 then B[1]:=1
         r:=B[i];
    else B[1]:=0;
         if B[i-1]=r then           //jeśli B[i-1]=r to trzeba zbadać A[i-r,j-r]
     for i:=2 to N do  
       if A[i,j]=0 then begin        //jeśli A[i,j]=0 to wartośc B[i] zależy od stareB i B[i]
         r:=B[i];  
         if stareB=r then                 //jeśli stareB=r to trzeba zbadać A[i-r,j-r]
           if A[i-r,j-r]=0 then bok:=r+1
           if A[i-r,j-r]=0 then bok:=r+1
           else bok:=r
           else bok:=r
         else bok:=min(stareB, r)+1;
         else bok:=min(B[i-1], r)+1;
         B[i]:=bok;
         B[i]:=bok;
        stareB:=r;
         if bok > maks then maks:=bok;
         if bok > maks then maks:=bok;
       end
       end
Linia 187: Linia 193:


==Zadanie 3 (Prostokąt)==
==Zadanie 3 (Prostokąt)==
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 maksymalne pole prostokąta składającego się z samych zer w tej tablicy.


{{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
{{wskazowka| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><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]. Licząc B[i,j], jeśli A[i,j] jest zerem, 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].  
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>
}}
 
{{wskazowka| 2||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><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].
 
Podobnie jak w zadaniu o kwadratach wystarczy do tego liniowa dodatkowa pamięć.
</div>
</div>
}}
 
{{rozwiazanie| 1||<div class="mw-collapsible mw-made=collapsible mw-collapsed"><div class="mw-collapsible-content" style="display:none">
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
var i,j,maks,r,podstawa,wysokośc,pole,  : integer;
    B : array [0..N] of integer;
begin
  maks:=0;                          //na maks będziemy pamiętać maksymalne pole dotychczas napotkanego prostokąta
  B[0]:=0;
  for i:=1 to N do                  //wypełniamy tablicę B zgodnie z pierwszym wierszem A
    if A[i,1]=0 then begin
      B[i]:=1
      maks:=1;
    end
    else B[i]:=0;
  for j:=2 to M do
    for i:=1 to N do begin
      if A[i,j]=0 then begin        //modyfikujemy B[i]
        B[i]:=B[i]+1;
      else B[i]:=0;
      podstawa:=1;                  //w pętli obliczamy maksymalne pole prostokąta zaczepionego prawym dolnym
      wysokość:=B[i];              //rogiem w A[i,j]  
      pole:=B[i];
      r:=i-1; ;     
      while B[r] <> 0 do begin      //nie przekroczymy zakresu tablicy B bo B[0]=0
        podstawa:=podstawa+1;
        wysokość:=min(wysokość, B[r]);
        pole:=max(pole, podstawa*wysokość);
      end;     
      if pole > maks then maks:=pole;
    end; //for i
  MaksProstokąt:=maks;
end
''Koszt czasowy'': liniowy względem N&times;N&times;M.
 
''Koszt pamięciowy'': liniowy względem N.
</div>
</div>
</div>
</div>
}}
}}

Wersja z 11:17, 3 paź 2006

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 1

{{{3}}}

Rozwiązanie 1

{{{3}}}

Rozwiązanie 2

{{{3}}}

Ćwiczenie 1

{{{3}}}

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

{{{3}}}

Rozwiązanie 1

{{{3}}}


Wskazówka 2

{{{3}}}

Rozwiązanie 2

{{{3}}}

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

{{{3}}}

Wskazówka 2

{{{3}}}

Rozwiązanie 1

{{{3}}}