A kumuláció (latin szó magyarul: összegyűjtődés, felhalmozódás) fogalmával találkoztunk a sorozatszámítás tételnél. Jelentése ez volt: valamilyen N-áris operáció (például: ∑⋅, ∏⋅, ∪⋅, ∩⋅, &⋅, …) kiszámításához a rokon bináris operációt (például: ⋅+⋅, ⋅*⋅, ⋅∪⋅, ⋅∩⋅, ⋅&⋅, …) kellett „sorozatosan” végezni az argumentum-sorozat elemein végig haladva, figyelembe véve az adott bináris művelethez tartozó neutrális értéket (a ∅∈H az ⊕:H×H→H operátorra nézve neutrális, ha teljesül ez a két azonosság: ∀e∈H: e⊕∅=e, ∅⊕e=e).
A fentiek után mit jelenthet a főcímben és különösen kiindulóul szolgáló példafeladat címében („kumulatív összegzés”) a kumulatív jelző, hiszen az összegzés szó maga is egyfajta kumulációt jelent? Nézzük a feladatot!
Adott egy N×M-es egészekből álló mátrix. Keressük azt a részmátrixát, amely elemeinek összege maximális.
Hasonlatos az előadás 2-6. diáin szerepelt feladathoz. Annak 2-dimenziós „általánosítása”.
Ugye világos az „absztrakt” gondolat:
Az előadás algoritmusát ismerve fogalmazza újra erre a mátrixos feladatra!
Az ábrázolás valami efféle:
Konstans MaxN:Egész(???) MaxM:Egész(???) Típus [a 0. sor és oszlop a feldolgozás rekurzív formulája miatt célszerű:] TMátrix=Tömb(0..MaxN,0..MaxM:Egész) TRészMátrix=Rekord(bfi,bfj,jai,jaj:Egész) Változó [bemenet:] N,M:Egész [mátrix-méretek] Mat:TMátrix [mátrix-elemek] [kimenet:] MaxRM:TRészMátrix [a max. részmátrix sarok elemeinek indexei] MaxÉrt:Egész [a max. részmártix elemösszege]
Találja ki a feldolgozás eljárásának az algoritmusát!
Eljárás Feldolgoz(Konstans N,M:Egész, Mat:TMátrix)
Eljárás Feldolgoz(Konstans N,M:Egész, Mat:TMátrix): Változó kumMat:TMátrix i,j,k,l:Egész [0. sor és 0. oszlop nullázása:] kumMat(0..N,0):=0; kumMat(0,1..M):=0 [(1,1)..(i,j) i=1..N,j=1..M részmátrix-összeg számítása:] Ciklus i=1-től N-ig Ciklus j=1-től M-ig kumMat(i,j):=kumMat(i,j-1) +(kumMat(i-1,j)-kumMat(i-1,j-1)) +Mat(i,j) Ciklus vége Ciklus vége [max-keresés:] MaxÉrt:=kumMat(1,1) MaxRM:=TRészMátrix(1,1,1,1) Ciklus i=1-től N-ig Ciklus j=1-től M-ig Ciklus k=i-től N-ig Ciklus l=j-től M-ig Ha kumMat(k,l)-kumMat(k,j-1)-kumMat(i-1,l)+kumMat(i-1,j-1)>MaxÉrt akkor MaxÉrt:=kumMat(k,l)-kumMat(k,j-1)-kumMat(i-1,l)+kumMat(i-1,j-1) MaxRM:=TRészMátrix(i,j,k,l) Elágazás vége Ciklus vége Ciklus vége Ciklus vége Ciklus vége Eljárás vége.
Kódolja a fenti probléma megoldását Pascalban! Feltesszük, hogy a mátrix elemeit egy karakteres fájl tartalmazza a szokásos formátumban. (1. sor: N M ; i+1. sor: Mati,1 Mati,2 ... Mati,M i=1..N)
Valami ilyesmire gondoltam: exe. Találhat hozzá egy bemeneti fájlt is, csak minta gyanánt: dat. Hogy elegendő legyen a lényegre szorítkoznia, letölthet egy keretprogramot is, amelyhez két inklúdállomány szükséges a Hasznos programtöredékek könyvtárból.
Adott egy táglalap alakú terület, amelyen különféle „tereptárgyak” vannak elhelyezve. Határozzuk meg a benne lévő legnagyobb üres téglalap alakú területet!
Visszavezethető az előbbi feladatra.