제출 #9723

#제출 시각아이디문제언어결과실행 시간메모리
9723silasOn grid (kriii2_O)C++98
1 / 4
1000 ms2392 KiB
#include <iostream>
#include <vector>
#include <string.h>
#define INF -987654321
using namespace std;

int R, C;
int  arr[303][303];
int  cache[303][303];

int psum_element(int y, int x, int val) {
	int ret = val;
	if (x - 1 >= 1) {
		ret += arr[y][x-1];
	}
	if (y - 1 >= 1) {
		ret += arr[y-1][x];
	}
	if (x - 1 >= 1 && y - 1>= 1)
		ret -= arr[y-1][x-1];
	return ret;
}

int dp (int y, int x) {
	if (y == 1)
		return arr[1][x];
	if (x == 1)
		return arr[y][1];
	int  &ret = cache[y][x];
	ret = INF;
	for (int i = y - 1; i >= 1; i--) {
		for (int j = x - 1; j >= 1; j--) {
			if (cache[i][j] != -1)
				ret = max(ret, cache[i][j] + arr[y][x] - arr[y][j] - arr[i][x] + arr[i][j]);
			else 
				ret = max(ret, dp(i, j) + arr[y][x] - arr[y][j] - arr[i][x] + arr[i][j]);
		}
	}
	ret = max(ret, arr[y][x]);
	return ret;
}

int main() {
	cin >> R >> C;
	memset(cache, -1, sizeof(cache));
	int temp;
	for (int i = 1 ; i <= R; i++) {
		for (int j = 1 ; j <= C; j++) {
			cin >> temp;
			arr[i][j] = psum_element(i, j, temp);
		}
	}
	cout << dp(R, C) << endl;


	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...