题目描述

这是一个炎热的夏天,奶牛贝茜感觉到相当的疲倦而且她也特别懒惰。她要在她的领域中找到一个合适的位置吃草,让她能吃到尽可能多的美味草并且尽量只在很短的距离。
奶牛贝茜居住的领域是一个 N×N 的矩阵。在这个的矩阵中,贝茜至多只愿意花上 K 步。
她的每一步移动到一个单元格中,她可以走向北,南,东,西四个方向。
例如,假设矩阵如下,其中(B)描述了贝茜的初始位置(初始位置在第 3 行第 3 列):

          *
    *     *     *
*   *    *(B)  *     *
     *     *     *
          *          

当 K=2,则贝茜只能达到标有*的位置。

请帮助贝茜确定她能获得的最多的美味草是多少,如果她在矩阵中选择最佳的初始位置(奶牛贝茜深知地图边界不是万丈深渊就是悬崖峭壁,她是不会为了满足自己的好奇心而冒这个险的)。

输入输出格式

输入格式:

第 1 行:两个整数 N 和 K;

接下来输入 N×N 的矩阵,第 i 行第 j 列用 A[i][j]表示这个单元格中美味草的数量;

输出格式:

输出共一行一个整数:贝茜能获得的最多的美味草的数量,如果她选择最佳的初始位置(从她能达到最多草地的位置)。

输入输出样例

输入样例1:

输出样例1:

输入样例2:

输出样例2:

说明

对于 20%的数据:1≤N≤100;0≤K≤20;

对于 50%的数据:1≤N≤400;0≤K≤200;

对于 100%的数据:1≤N≤1,000;0≤A[i][j]≤1,000;0≤K≤2N;

解题思路

我们在输入时把整个矩阵旋转一下,比如数据2(%5d):

接下来统计前缀和即可

 #include<stdio.h>
 #include<algorithm>
 using namespace std;
 ][],sum[][],ans;
 int main()
 {
     scanf("%d%d",&n,&m);
     m=m*+;
     ;i<=n;i++)
         ;j<=n;j++)
             scanf(][n-i+j]);

     ;i<=*n;i++)//求矩形(0,0)到(i,j)的和,前缀和求解
         ;j<=*n;j++)
             sum[i][j]=sum[i-][j]+sum[i][j-]-sum[i-][j-]+a[i][j];

     ;i<=*n;i++)
         ;j<=*n;j++)
             )^(j&))!=(n&))
                 ans=max(ans,sum[i][j]-sum[max(,i-m)][j]-sum[i][max(,j-m)]+sum[max(,i-m)][max(,j-m)]);

     printf("%d\n",ans);

     ;
 }

注:此题似乎需要读优,scanf会炸...

05-12 19:54