ICPC2017 国内予選 C 池のある庭園

解法

与えられるデータの幅高さのうち大きいほうをnとすると、
nが小さいので、池の候補になりうる長方形をO(n^4)通り全探索して間に合う。
長方形をひとつ調べるのにO(n^2)かかるので全体の計算量はO(n^6).

ソースコード

int main(){
	int h, w;
	while(cin >> h >> w, h){
		vector<vi> in(h, vi(w));
		rep(i, h) rep(j, w) cin >> in[i][j];
		
		auto check = [&](int y, int x, int Y, int X){
			
			int omin = inf, imax = -1, isum = 0;
			for(int i = y; i <= Y; i++) for(int j = x; j <= X; j++){
				bool inner = (i != y && i != Y) && (j != x && j != X);
				if(inner){
					isum += in[i][j];
					imax = max(imax, in[i][j]);
				}
				else omin = min(omin, in[i][j]);
			}
			//dbg(omin, imax, isum);
			if(imax < 0 || omin <= imax) return -1;
			return omin * (Y - y - 1) * (X - x - 1) - isum;
		};
		int ans = 0;
		rep(Y, h) rep(y, Y) rep(X, w) rep(x, X) ans = max(ans, check(y, x, Y, X));
		cout << ans << endl;
	}
	return 0;
}