zoukankan      html  css  js  c++  java
  • 洛谷 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;
    }
    
  • 相关阅读:
    ST表学习笔记
    LCA学习笔记
    $ZOJ 2432 Greatest Common Increasing Subsequence$
    $SP15637 GNYR04H - Mr Youngs Picture Permutations$
    Noip2016换教室
    洛谷4718【模板】Pollard-Rho算法
    CQOI2016 密钥破解
    Poj3696 The Lukiest Number
    Noip2012同余方程
    同余
  • 原文地址:https://www.cnblogs.com/acioi/p/11705224.html
Copyright © 2011-2022 走看看