洛谷 P2004 领地选择 题解
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;
}