【usaco2013 mar】懒惰的奶牛[s](lazy_silver.pas/cpp/c) //2018.1.28

题目

题目描述

夏天到了,奶牛贝里斯又开始变得懒惰起来。他想要站在一个地方,然后吃掉一定范围内的所有青草。
贝里斯所在的田地可以描述为一个N*N的方阵,对于方阵中的第r行和第c列上的数字G(r,c),表示这个小方格中青草的数量。贝里斯会在方阵中选择一个初始位置(小方格),然后以这个位置为起点经过的步数不超过K的地方的青草都将被贝里斯吃掉。每走一步,就是走到相邻(上下左右直接相邻)的其中一个小方格中去。
例如,有一个方阵如图所示,贝里斯的初始位置是(3,3),有(B)标示的地方。
这里写图片描述
输入
第一行是两个正整数N和K。
接下里N行,每行N个整数,表示方阵。
输出
贝里斯最多能吃到的青草的数量。
【数据规模】
1<=N<=400,0<=G(r,c)<=1000,0<=K<=2*N。

题目大意

在一个矩阵,选择一个初始位置(小方格),求以这个位置为起点经过的步数不超过K的地方的青草值最大。

解题思路

也可以采用前缀和,然后枚举求出一这个点为中心,k步的值


代码

#include<cstdio>
using namespace std; 
int n,k,maxn,ans,a[1001][1001],b[1001][1001]; 
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; 
        int o=i-k; if (o<1) o=1; //行的上限
        int o1=i+k; if (o1>n) o1=n; //行的下限
        for (int z=o;z<=o1;z++) //枚举
        {
            int u=i-z>0?i-z:z-i; //已经走了多少步,为v,g转折准备
            int v=j+k-u>n?n:j+k-u; //列的最右边
            int g=j-k+u<1?1:j-k+u; //列的最左边
            ans+=b[z][v]-b[z][g-1]; //累加
        }
        maxn=maxn>ans?maxn:ans; //记录最大值
     }
     printf("%d",maxn); 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值