După ce ți-ai dat seama că nu poți învinge nici unul dintre monștrii (din problema SAO), ai decis să te retragi și să devii un fermier. Din banii pentru cumpărarea echipamentului ai cumpărat o parcelă codificată sub forma unei matrice de n
linii și m
coloane, pentru fiecare zonă cunoscându-se fertilitatea ei. Cum nu ai bani ca să cultivi pământul, dorești să selectezi o parcelă în care toate zonele să aibă aceeași fertilitate, iar fertilitatea totală să fie maximă. Fertilitatea totală a unei parcele este egală cu suma fertilităților zonelor care compun acea parcelă.
Cerința
Dându-se matricea codificărilor zonelor din teren, să se determine fertilitatea totală maximă a unei parcele în care toate zonele au aceeași fertilitate.
Date de intrare
Fișierul de intrare sao1.in
conține pe prima linie numerele n
şi m
, iar pe următoarele n
linii câte m
numere naturale, separate prin spaţii, reprezentând elementele matricei.
Date de ieșire
Fișierul de ieșire sao1.out
va conține numărul P
, reprezentând fertilitatea totală maximă a unei parcele, în condițiile date.
Restricții și precizări
1 ≤ n,m ≤ 500
- fertilitatea totală se va încadra pe tipul de date
long long
. - nu există sol infertil (a cărui fertilitate să fie mai mică sau egală cu
0
). - acesta este “bad ending”-ul problemei SAO
Exemplu 1:
sao1.in
4 4 1 1 1 3 1 1 1 3 1 1 1 3 3 3 3 3
sao1.out
21
Explicație
Cele 7
valori de 3
formează zona cu profit maxim.
Exemplu 2:
sao1.in
4 4 3 5 1 3 1 5 5 3 5 5 5 3 3 3 3 3
sao1.out
30
Explicație
Cele 6
valori de 5
formează zona cu profit maxim.
#include <bits/stdc++.h> using namespace std; ifstream cin("sao1.in"); ofstream cout("sao1.out"); long long a[501][501], c, f; int n, m; void fill(int i, int j){ c++; a[i][j] = 0; if(a[i+1][j] == f) fill(i+1, j); if(a[i-1][j] == f) fill(i-1, j); if(a[i][j+1] == f) fill(i, j+1); if(a[i][j-1] == f) fill(i, j-1); } int main() { cin >> n >> m; for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) cin >> a[i][j]; long long maxi = 0; for(int i = 1; i <= n; ++i) for(int j = 1; j <= m; ++j) if(a[i][j] != 0){ f = a[i][j]; c = 0; fill(i, j); if(c * f > maxi) maxi = c * f; } cout << maxi; return 0; }