SRM 636 Div. 1 Easy: ChocolateDividingEasy

解法

どう見ても累積和の問題なんだけど、愚直な全探索で通った(通った)。

コード

public class ChocolateDividingEasy {

	public int findBest(String[] choco) {
		int H = choco.length;
		int W = choco[0].length();
		int[][] chocoMap = new int[H][W];
		for (int i = 0; i < H; i++) {
			for (int j = 0; j < W; j++) {
				chocoMap[i][j] = Character.getNumericValue(choco[i].charAt(j));
			}
		}

		int max = 0;
		for (int i = 1; i < W - 1; i++) {
			for (int j = i + 1; j < W; j++) {
				for (int i2 = 1; i2 < H - 1; i2++) {
					for (int j2 = i2 + 1; j2 < H; j2++) {

						int min = sumSpace(0, i, 0, i2, chocoMap);
						min = Math.min(sumSpace(i, j, 0, i2, chocoMap), min);
						min = Math.min(sumSpace(j, W, 0, i2, chocoMap), min);
						min = Math.min(sumSpace(0, i, i2, j2, chocoMap), min);
						min = Math.min(sumSpace(i, j, i2, j2, chocoMap), min);
						min = Math.min(sumSpace(j, W, i2, j2, chocoMap), min);
						min = Math.min(sumSpace(0, i, j2, H, chocoMap), min);
						min = Math.min(sumSpace(i, j, j2, H, chocoMap), min);
						min = Math.min(sumSpace(j, W, j2, H, chocoMap), min);

						max = Math.max(max, min);

					}
				}

			}
		}

		return max;
	}

	int sumSpace(int i, int j, int i2, int j2, int[][] map) {
		/*
		 * 横にi<=x<j 縦にi2<=y<j2
		 */

		int ans = 0;
		for (int l = i2; l < j2; l++) {
			for (int k = i; k < j; k++) {
				ans += map[l][k];
			}
		}
		return ans;

	}

}