首页 > 技术文章 > 洛谷 P2004 领地选择 题解

acioi 2019-10-19 21:13 原文

P2004 领地选择

题目描述

作为在虚拟世界里统帅千军万马的领袖,小Z认为天时、地利、人和三者是缺一不可的,所以,谨慎地选择首都的位置对于小T来说是非常重要的。

首都被认为是一个占地C*C的正方形。小Z希望你寻找到一个合适的位置,使得首都所占领的位置的土地价值和最高。

输入格式

第1行:三个正整数N,M,C,表示地图的宽和长以及首都的边长。

第2∼N+1行:第i+1行包含M个整数,表示了地图上每个地块的价值。价值可能为负数。

输出格式

一行,两个整数X、Y,表示首都左上角的坐标。

输入输出样例

输入 #1

3 4 2
1 2 3 1
-1 9 0 2
2 0 1 1

输出 #1

1 2

说明/提示

对于60%的数据:N、M≤50。

对于90%的数据:N、M≤300。

对于100%的数据:N、M≤1000,C≤min(N,M)。

【思路】

二维前缀和
很有意思的一道题
简直就是二维前缀和的模板
只要好好利用二维前缀和
能够求出以每个点为右下角的矩阵里价值最大的点的位置就可以了

二维前缀和详解

【完整代码】

#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
const int Max = 1003;
int a[Max][Max];
int f[Max][Max];
signed main()
{
	int n,m,c;
	cin >> n >> m >> c;
	for(register int i = 1;i <= n;++ i)
		for(register int j = 1;j <= m;++ j)
			cin >> a[i][j],f[i][j] = f[i - 1][j] + f[i][j - 1] - f[i - 1][j - 1] + a[i][j];
	int M = 0,x,y;
	for(register int i = c;i <= n;++ i)
		for(register int j = c;j <= m;++ j)
			if(f[i][j] + f[i - c][j - c] - f[i - c][j] - f[i][j - c] > M)
			{
				int acioi = f[i][j] + f[i - c][j - c] - f[i - c][j] - f[i][j - c];
				M = acioi;
				x = i,y = j;
			}
//	cout << x << " " << y << endl;
	cout << x - c + 1 << " " << y - c + 1 << endl;
	return 0;
}

推荐阅读