Ciao, sto cercando di risolvere questo esercizio sulla piattaforma Terry. Per rendere il codice più veloce creo una matrice di somme e poi vado a calcolare i vari casi (per non fare quattro cicli annidati). Cosa devo fare per prendere il massimo?
#include <iostream>
#include <vector>
using namespace std;
void solve (int t)
{
int N, M, K, A, B;
cin >> N >> M >> K >> A >> B;
int alberi[N][M]={}, sum[N][M]={};
vector<int> sol;
for (int i = 0; i < K; i++)
{
int I, J;
cin >> I >> J;
alberi[I][J]++;
}
for (int i=0; i<N; i++)
{
for (int j=0; j<M; j++)
{
sum[i][j]=alberi[i][j];
if (i>0)
sum[i][j]=sum[i][j]+sum[i-1][j];
if (j>0)
sum[i][j]=sum[i][j]+sum[i][j-1];
if (i>0&&j>0)
sum[i][j]=sum[i][j]-sum[i-1][j-1];
}
}
for (int I=A-1; I<N; I++)
{
for (int J=B-1; J<M; J++)
{
int s=sum[I][J];
if (I>A-1)
s=s-sum[I-A][J];
if (J>B-1)
s=s-sum[I][J-B];
if (I>A-1&&J>B-1)
s=s+sum[I-A][J-B];
sol.push_back(s);
}
}
int min=sol[0];
for (int i=1; i<sol.size(); i++)
{
if (sol[i]<min)
min=sol[i];
}
cout << "Case #" << t << ": " << min << "\n";
}
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
int T;
cin >> T;
for (int t = 1; t <= T; t++)
{
solve(t);
}
return 0;
}