原题链接:
领地选择 - 洛谷https://www.luogu.com.cn/problem/P2004
题目描述
作为在虚拟世界里统帅千军万马的领袖,小 Z 认为天时、地利、人和三者是缺一不可的,所以,谨慎地选择首都的位置对于小 Z 来说是非常重要的。
首都被认为是一个占地 C×C 的正方形。小 Z 希望你寻找到一个合适的位置,使得首都所占领的位置的土地价值和最高。
输入格式
第一行三个整数 N,M,C表示地图的宽和长以及首都的边长。
接下来 N 行每行 M 个整数,表示了地图上每个地块的价值。价值可能为负数。
输出格式
一行两个整数 X,Y 表示首都左上角的坐标。
输入输出样例
输入 #1复制
3 4 2 1 2 3 1 -1 9 0 2 2 0 1 1
输出 #1复制
1 2
说明/提示
对于 100% 的数据,1≤N,M≤10^3,1≤C≤min(N,M)。
思路:
先使用二维前缀和将矩阵存储起来,枚举C*C的方阵的左上角坐标,则左下角坐标为i+c-1,j+c-1,越界则跳过,一次矩阵求和时间复杂度为O(1) 所以总时间复杂度为O(nm)
ACcode:
#include<bits/stdc++.h>
int ans = -0x3f3f3f3f;
using namespace std;
int a[1005][1005];
int sum[1005][1005];
int ux,uy;
int n,m,c;
int main()
{
cin>>n>>m>>c;
for(int i = 1;i<=n;++i)
for(int j = 1;j<=m;++j)
{
cin>>a[i][j];
sum[i][j] = a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
}
for(int i = 1;i<=n;++i)
for(int j = 1;j<=m;++j)
{
if(i+c-1>n||j+c-1>m) continue;
if(sum[i+c-1][j+c-1]-sum[i-1][j+c-1]-sum[i+c-1][j-1]+sum[i-1][j-1]>ans)
{
ans = sum[i+c-1][j+c-1]-sum[i-1][j+c-1]-sum[i+c-1][j-1]+sum[i-1][j-1];
ux = i,uy = j;
}
}
cout<<ux<<" "<<uy<<endl;
return 0;
}