题目链接:领地选择 - 洛谷
思路:先算二维前缀和,再差分。
注意点:输出左上角坐标,因此在循环算面积时,i+c要减1.
#include<iostream>
using namespace std;
typedef long long ll;
const int MAXN=1005;
ll a[MAXN][MAXN];
int n,m,c;
ll s,ans=-0X3f3f3f3f;
int ax,ay;
int main()
{
//freopen("D:\\p2004_2.in","r",stdin);
cin>>n>>m>>c;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
cin>>a[i][j];
a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
}
}
for(int i=1;i+c<=n+1;++i)
{
for(int j=1;j+c<=m+1;++j)
{
s=a[i+c-1][j+c-1]+a[i-1][j-1]-a[i+c-1][j-1]-a[i-1][j+c-1];
if(s>ans)
{
ans=s;
ax=i;
ay=j;
}
}
}
cout<<ax<<" "<<ay<<endl;
return 0;
}