求助 After_contest_38 & 39
查看原帖
求助 After_contest_38 & 39
857626
_RainCappuccino_楼主2024/3/31 15:50

感觉是边界问题反复看了都感觉没问题?

using namespace std;
#define int long long
const int N = 2000 + 10;
#define endl '\n'
int n, m;
int sum[N][N], a[N][N], b[N][N], c[N][N], d[N][N], dp[N][N], f[N][N]; // a:左上 b:右上 c:左下 d:右下
int s[N][N]; // 表示以 (i, j) 为左上角的 m * m 正方形
int v[N][N];
void init () {
	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= n; j ++) {
			sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + v[i][j];
		}
	}
	for (int i = 1; i <= n - m + 1; i ++) {
		for (int j = 1; j <= n - m + 1; j ++) {
			s[i][j] = sum[i + m - 1][j + m - 1] - sum[i - 1][j + m - 1] - sum[i + m - 1][j - 1] + sum[i - 1][j - 1];
		}
	}
	for (int i = m; i <= n; i ++) {
		for (int j = m; j <= n; j ++) {
			a[i][j] = max(max(a[i - 1][j], a[i][j - 1]), s[i - m + 1][j - m + 1]);
		}
		for (int j = n - m + 1; j >= 1; j --) {
			b[i][j] = max(max(b[i - 1][j], b[i][j + 1]), s[i - m + 1][j]);
		}
	}
	for (int i = n - m + 1; i >= 1; i --) {
		for (int j = m; j <= n; j ++) {
			c[i][j] = max(max(c[i + 1][j], c[i][j - 1]), s[i][j - m + 1]);
		}
		for (int j = n - m + 1; j >= 1; j --){
			d[i][j] = max(max(d[i + 1][j], d[i][j + 1]), s[i][j]);
		}
	}
	for (int i = 1; i <= n - m + 1; i ++) {
		for (int j = 1; j <= n; j ++) {
			dp[i][i + m - 1] = max(dp[i][i + m - 1], s[i][j]);
		}
	}
	for (int len = 1; len <= n; len ++) {
		for (int i = 1; i + len - 1 <= n; i ++) {
			int j = i + len - 1;
			dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
		}
	}
	for (int i = 1; i <= n - m + 1; i ++) {
		for (int j = 1; j <= n; j ++) {
			f[i][i + m - 1] = max(f[i][i + m - 1], s[j][i]);
		}
	}
	for (int len = 1; len <= n; len ++) {
		for (int i = 1; i + len - 1 <= n; i ++) {
			int j = i + len - 1;
			f[i][j] = max(f[i + 1][j], f[i][j - 1]);
		}
	}
}
int getmax() {
	int res = 0;
	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= n; j ++) {
			res = max(res, a[i][j] + b[i][j + 1] + d[i + 1][1]);
			res = max(res, a[i][j] + c[i + 1][j] + d[1][j + 1]);
			res = max(res, c[1][j] + b[i][j + 1] + d[i + 1][j + 1]);
			res = max(res, a[i][n] + c[i + 1][j] + d[i + 1][j + 1]);
		}
	}
	for (int i = 1; i <= n; i ++) {
		for (int j = i + m; j + m <= n; j ++) {
			res = max(res, dp[1][i] + dp[i + 1][j] + dp[j + 1][n]);
			res = max(res, f[1][i] + f[i + 1][j] + f[j + 1][n]);
		}
	}
	return res;
}

signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= n; j ++) {
			cin >> v[i][j];
		}
	}
	init();
	cout << getmax();
	return 0;
}
2024/3/31 15:50
加载中...