(纪中)1931. 懒惰的奶牛[s](lazy_silver)

探讨了在限定步数内,如何使奶牛贝里斯从任意起点出发,通过遍历相邻方格来最大化获取青草数量的问题。利用前缀和优化计算过程,通过枚举方法找出最优解。

(File IO): input:lazy_silver.in output:lazy_silver.out
时间限制: 1000 ms 空间限制: 128000 KB 具体限制


题目描述
夏天到了,奶牛贝里斯又开始变得懒惰起来。他想要站在一个地方,然后吃掉一定范围内的所有青草。贝里斯所在的田地可以描述为一个N*N的方阵,对于方阵中的第rrr行和第ccc列上的数字G(r,c)G(r,c)Grc,表示这个小方格中青草的数量。贝里斯会在方阵中选择一个初始位置(小方格),然后以这个位置为起点经过的步数不超过K的地方的青草都将被贝里斯吃掉。每走一步,就是走到相邻(上下左右直接相邻)的其中一个小方格中去。例如,有一个方阵如图所示,贝里斯的初始位置是(3,3)(3,3)3,3,有(B)(B)B标示的地方。

如果K=2K=2K=2,那么贝里斯只能走到∗*号所标示的地方。如果初始的位置可以选择的话,请帮助贝里斯计算他最多能吃到的青草的数量。


输入
第一行是两个正整数NNNKKK
接下里NNN行,每行NNN个整数,表示方阵。

输出
贝里斯最多能吃到的青草的数量。


样例输入
5 2
50 5 25 6 17
14 3 2 7 21
99 10 1 2 80
8 7 5 23 11
10 0 78 1 9

样例输出
342


数据范围限制
1<=N<=400,0<=G(r,c)<=1000,0<=K<=2∗N1<=N<=400,0<=G(r,c)<=1000,0<=K<=2*N1<=N<=400,0<=G(r,c)<=1000,0<=K<=2N


提示
样例中,如果贝里斯的初始位置是(3,3)(3,3)3,3的话,他能吃到最多的青草数量是342342342


解题思路
可以采用前缀和,然后枚举求出一这个点为中心,k步的值。
__
代码

#include<bits/stdc++.h>
using namespace std;
int n,k,a[410][820],b[410][820],x,y,s,o,o1,maxn,ans;
int main()
{
	freopen("lazy_silver.in","r",stdin);
    freopen("lazy_silver.out","w",stdout);
    scanf("%d%d",&n,&k);
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            scanf("%d",&a[i][j]);
            b[i][j]=b[i][j-1]+a[i][j];//前缀和
        }
    }
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=n; j++)
        {
            ans=0;
            o=i-k;
            if (o<1) o=1;//行的上限
            o1=i+k;
            if (o1>n) o1=n;//行的下限
            for(int z=o; z<=o1; z++)
            {
                s=abs(i-z);//已经走了多少步
                x=min(j+k-s,n);//列的最右边
                y=max(j-k+s,1);//列的最左边
                ans+=b[z][x]-b[z][y-1];//累加
            }
            maxn=max(maxn,ans);//记录最大值
        }
    }
    printf("%d",maxn);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值