二次元における四角形の範囲の和を求めるには、二次元累積和を用いることが有効です。
二次元累積和を用いることにより、累積和の前計算で の計算量がかかりますが、 の範囲の和を で求めることができます。
よって、十分高速にこの問題を解くことができました。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, a, b;
cin >> n >> a >> b;
vector<vector<long long>> v(n, vector<long long>(n));
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cin >> v[i][j];
}
}
vector<vector<long long>> sum(n + 1, vector<long long>(n + 1));
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
sum[i+1][j+1] += sum[i+1][j] + sum[i][j+1] - sum[i][j] + v[i][j];
}
}
long long ans = 0;
for(int i = 0; i < n - a + 1; i++){
for(int j = 0; j < n - b + 1; j++){
ans = max(ans, sum[i + a][j + b] - sum[i + a][j] - sum[i][j + b] + sum[i][j]);
}
}
cout << ans << endl;
}