- 動的計画法
- 横方向でここからここまでの和というテーブルを作り、
- 縦方向でそれらを足し合わせる
- O(N^4)
int main() {
int N;
scanf("%d", &N);
for (int row = 0; row < N; ++row) {
for (int column = 0; column < N; ++column) {
int value;
scanf("%d", &value);
matrix[row][column] = (char)value;
}
}
for (int row = 0; row < N; ++row) {
for (int left = 0; left < N; ++left) {
int sum = 0;
for (int right = left + 1; right <= N; ++right) {
sum += matrix[row][right - 1];
dp0[row][left][right] = (short) sum;
}
}
}
int bestSum = INT_MIN;
for (int left = 0; left < N; ++left) {
for (int right = left + 1; right <= N; ++right) {
for (int top = 0; top < N; ++top) {
int sum = 0;
for (int bottom = top + 1; bottom <= N; ++bottom) {
sum += dp0[bottom - 1][left][right];
if (bestSum < sum) {
bestSum = sum;
}
}
}
}
}
cout << bestSum << endl;
}