ACM-ICPC 2017 国内予選: C. 池のある庭園
solution
縦幅$d \le 10$かつ横幅$w \le 10$と小さい。 枠となる長方形を全て試し、内部についても愚直にやる。$O((dw)^3)$。
implementation
本番にペアプロしたやつそのまま。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf = 1e9 + 7;
int main() {
int h, w;
while (cin >> h >> w) {
if (h == 0 && w == 0) break;
vector<vector<ll> > e(h, vector<ll> (w));
for (int y = 0; y < h; y ++) {
for (int x = 0; x < w; x ++) {
cin >> e[y][x];
}
}
ll ans = 0;
for (int ly = 0; ly < h; ly ++) {
for(int lx = 0; lx < w; lx ++) {
for (int ry = ly + 2; ry < h; ry ++) {
for (int rx = lx + 2; rx < w; rx ++) { //[l, r]
ll sum = 0;
ll ma = 0, mi = inf;
for (int y = ly; y <= ry; y ++) {
mi = min(mi, e[y][lx]);
mi = min(mi, e[y][rx]);
}
for (int x = lx + 1; x <= rx - 1; x ++) {
mi = min(mi, e[ly][x]);
mi = min(mi, e[ry][x]);
}
for (int y = ly + 1; y <= ry - 1; y ++) {
for (int x = lx + 1; x <= rx - 1; x ++) {
ma = max(ma, e[y][x]);
sum += e[y][x];
}
}
if (mi > ma) ans = max(ans, mi * ((ry - ly - 1) * (rx - lx - 1)) - sum);
}
}
}
}
cout << ans << endl;
}
}