CF1676D X-Sum 题解

题意

给出一个有权值的棋盘, 现在要求你选定一个象的位置, 使象可以攻击的点的权值和最大。

象的攻击方法是斜着走。

看到数据范围这么小, 可以想到用暴力, 每个点都计算可能到达的地方的权值和。

至于计算权值和,四个方向模拟一下就可以了。

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;
constexpr int inf = INT_MAX;
constexpr i64 lnf = LONG_LONG_MAX;
constexpr int N = 210;
constexpr int dx[] = {1, -1},
			  dy[] = {1, -1};

int a[N][N];
void solve() {
	memset(a, 0, sizeof a);
	int n, m;
	cin >> n >> m;

	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			cin >> a[i][j];
		}
	}	
	function<int(int, int)> dfs = [&](int x, int y) {
		int X = x, Y = y, ans = 0;
		while (X >= 0 && Y >= 0) {
			ans += a[X][Y];	
			X--, Y--;
		}
		X = x, Y = y;
		while (X >= 0 && Y < m) {
			X--, Y++;
			if (X >= 0 && Y < m)
				ans += a[X][Y];
		}
		X = x, Y = y;
		while (X < n && Y >= 0) {
			X++, Y--;
			if (X < n && Y >= 0)
				ans += a[X][Y];
		}
		X = x, Y = y;
		while (X < n && Y < m) {
			X++, Y++;
			if (X < n && Y < m)
				ans += a[X][Y];
		}
		return ans;
	};

	int ans = -inf;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			ans = max(ans, dfs(i, j));
		}
	}
	cout << ans << endl;
	
	return;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int T;
	cin >> T;
	while (T--) {
		solve();
	}

	return 0;
}
posted @ 2022-05-21 23:30  落花月朦胧  阅读(54)  评论(0编辑  收藏  举报