求助,样例不过
查看原帖
求助,样例不过
1345783
BK小鹿楼主2024/11/5 23:06

rt

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 15;

int n;
int a[N][N], f[N][N][N][N];

int dfs(int x, int y, int x1, int y1) {
	if (f[x][y][x1][y1] != -1) {
		return f[x][y][x1][y1];
	}
	if (x == n && y == n && x1 == n && y1 == n) {
		return 0;
	}
	int now = 0;
	if (x < n && x1 < n) {
		int cnt = dfs(x + 1, y, x1 + 1, y1);
		if (x == x1 && y == y1) {
			now = max(now, a[x + 1][y] + cnt);
		}else {
			now = max(now, a[x + 1][y] + a[x1 + 1][y] + cnt);
		}
	}
	if (y < n && x1 < n) {
		int cnt = dfs(x, y + 1, x1 + 1, y1);
		if ((x == x1 + 1) && (y + 1 == y1)) {
			now = max(now, a[x][y + 1] + cnt);
		}else {
			now = max(now, a[x][y + 1] + a[x1 + 1][y1] + cnt);
		}
	}
	if (y < n && y1 < n) {
		int cnt = dfs(x, y + 1, x1, y1 + 1);
		if ((x == x1) && (y == y1)) {
			now = max(now, a[x][y + 1] + cnt);
		}else {
			now = max(now, a[x][y + 1] + a[x1][y1 + 1] + cnt);
		}
	}	
	if (x < n && y1 < n) {
		int cnt = dfs(x + 1, y, x1, y1 + 1);
		if ((x + 1 == x1) && (y == y1 + 1)) {
			now = max(now, a[x + 1][y] + cnt);
		} else {
			now = max(now, a[x + 1][y] + a[x1][y1 + 1] + cnt);
		}
	}
	f[x][y][x1][y1] = now;
	return now;
/*	if (y < n && x1 < n) {
		int cnt = dfs(x, y + 1, x1 + 1, y1);
		if ((x == x1 + 1) && (y + 1 == y1)) {
			now = max(now, a[x][y + 1] + cnt);
		}else {
			now = max(now, a[x][y + 1] + a[x1 + 1][y] + cnt);
		}
	}	*/
	
}

int main() {
	memset(f, -1, sizeof f);
	cin >> n;
	while (1) {
		int x, b, c;
		cin >> x >> b >> c;
		if (x == 0 && b == 0 && c == 0) break;
		a[x][b] = c;
	}	
	cout << dfs(1, 1, 1, 1) + a[1][1] << endl;
	return 0;
}
2024/11/5 23:06
加载中...