洛谷 领地选择 二维前缀和

398 阅读2分钟

洛谷P2004 领地选择

  1. 重点:

    1. 如何求二维前缀和数组

      map[i][j] = map[i-1][j]+map[i][j-1]-map[i-1][j-1]+map[i][j];
      i和j记得从1开始,要留个边缘的0出来
      
    2. 如果求宽度为c的子矩阵的和

      t = map[i+c-1][j+c-1] - map[i-1][j+c-1] - map[i+c-1][j-1] + map[i-1][j-1];
      

      知道了这两点,这题就是一个简单的前缀和问题了,详情参见: 浅谈二维前缀和

注水代码:

#include<iostream>
#include<algorithm>

using namespace std;

int map[1005][1005],n,m,t=-999999999,x,y,maxn,c;
/*
    二位前缀和
    f[i][j] = f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j];
*/
int main(){
    freopen("data.in","r",stdin);
    cin>>n>>m>>c;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            cin>>map[i][j];
            map[i][j] = map[i-1][j]+map[i][j-1]-map[i-1][j-1]+map[i][j];
        } 
    for(int i=1;i<=n-c+1;i++){
        for(int j=1;j<=m-c+1;j++){
            t = map[i+c-1][j+c-1] - map[i-1][j+c-1] - map[i+c-1][j-1] + map[i-1][j-1];
            if(t>maxn){
                x = i;
                y = j;
                maxn = t;
            }
        }
    }
    cout<<x<<" "<<y;
    return 0;
}

题面:

题目描述

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

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

输入格式

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

接下来 NN 行每行 MM 个整数,表示了地图上每个地块的价值。价值可能为负数。

输出格式

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

输入输出样例

输入 #1复制

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

输出 #1复制

1 2

说明/提示

对于 60%60% 的数据,N,M\le 50N,M≤50。

对于 90%90% 的数据,N,M\le 300N,M≤300。

对于 100%100% 的数据,1\le N,M\le 10^31≤N,M≤103,1\le C\le \min(N,M)1≤C≤min(N,M)。