Cerința
Gigel are o livadă împărțită în n*m
sectoare, dispuse pe n
linii, numeroate de la 1
la n
și m
coloane, numerotate de la 1
la m
. În fiecare sector se află un cireș, care conține o cantitate de cireșe cunoscută. Gigel va culege toate cireșele din cireșii dispuși într-o zonă dreptunghiulară din livadă. El poate să aleagă între k
zone și dorește să culeagă cât mai multe cireșe.
Scrieți un program care determină cantitatea maximă de cireșe pe care o poate culege Gigel din una dintre cele k
zone date.
Date de intrare
Programul citește de la tastatură numerele n m k
, cu semnificația de mai sus. Apoi citește cantitatea de cireșe din fiecare sector, linie cu linie. Apoi citește k
perechi de coordonate i1 j1 i2 j2
, unde i1 j1
reprezintă coordonatele (linie coloana) ale colțului stânga-sus al zonei curente, iar i2 j2
reprezintă coordonatele (linie coloana) ale colțului dreapta-jos al zonei curente.
Date de ieșire
Programul va afișa pe ecran numărul C
, reprezentând cantitatea maximă de cireșe care poate fi culeasă din una dintre zonele date.
Restricții și precizări
1 ≤ n , m ≤ 1000
1 ≤ k ≤ 10000
- cantitatea de cireșe din fiecare sector este un număr natural mai mic decât
10000
1 ≤ i1 ≤ i2 ≤ n
1 ≤ j1 ≤ j2 ≤ m
- dacă ați rezolvat problema #Cirese ați observat deja că acum livada este mai mare, iar Gigel are mai multe variante de a alege zona din care să culeagă cireșele.
Exemplu
Intrare
4 6 3 3 1 10 7 5 2 1 5 3 8 6 3 10 1 3 8 10 8 6 1 8 3 9 1 2 2 3 5 1 2 4 6 2 1 4 3
Ieșire
102
Explicație
Cantitatea de cireșe care pot fi culese din zona a doua este 102
și este mai mare decât cantitățile din celelalte două zone.
#include <bits/stdc++.h> using namespace std; int a[1001][1001], n, m, k; long long sp[1001][1001]; int main(){ cin >> n >> m >> k; for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) cin >> a[i][j], sp[i][j] = sp[i-1][j] + sp[i][j-1] + a[i][j] - sp[i-1][j-1]; int i1,j1,i2,j2; long long max = 0; for(int l = 1; l <= k; ++l){ cin >> i1 >> j1 >> i2 >> j2; long long sum = sp[i2][j2] - sp[i2][j1-1] - sp[i1-1][j2] + sp[i1-1][j1-1]; if(sum > max) max = sum; } cout << max; return 0; }