其他分享
首页 > 其他分享> > USACO The Lazy Cow

USACO The Lazy Cow

作者:互联网

题目描述

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

 

50    5      25*    6      17
14    3*     2*     7*     21
99*   10*    1*(B)  2*     80*
8     7*     5*     23*    11
10    0      78*    1      9

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

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

 

输入输出格式

输入格式:

 

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

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

 

输出格式:

 

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

 

输入输出样例

输入样例1:

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

 

输出样例1:

342

 

输入样例2:

5 2
1000 1 1 1 1
1000 8 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1

 

输出样例2:

2016

 

说明

对于 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):

0     0     0     0  1000     0     0     0     0     0
0     0     0  1000     0     1     0     0     0     0
0     0     1     0     8     0     1     0     0     0
0     1     0     1     0     1     0     1     0     0
1     0     1     0     1     0     1     0     1     0
0     1     0     1     0     1     0     1     0     0
0     0     1     0     1     0     1     0     0     0
0     0     0     1     0     1     0     0     0     0
0     0     0     0     1     0     0     0     0     0
0     0     0     0     0     0     0     0     0     0

接下来统计前缀和即可

 

 1 #include<stdio.h>
 2 #include<algorithm>
 3 using namespace std;
 4 int n,m,a[2005][2005],sum[2005][2005],ans;
 5 int main()
 6 {
 7     scanf("%d%d",&n,&m);
 8     m=m*2+1;
 9     for(int i=1;i<=n;i++)
10         for(int j=1;j<=n;j++)
11             scanf("%d",&a[i+j-1][n-i+j]);
12     
13     for(int i=1;i<=2*n;i++)//求矩形(0,0)到(i,j)的和,前缀和求解
14         for(int j=1;j<=2*n;j++)
15             sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
16     
17     for(int i=1;i<=2*n;i++)
18         for(int j=1;j<=2*n;j++)
19             if(((i&1)^(j&1))!=(n&1))
20                 ans=max(ans,sum[i][j]-sum[max(0,i-m)][j]-sum[i][max(0,j-m)]+sum[max(0,i-m)][max(0,j-m)]);
21     
22     printf("%d\n",ans);
23     
24     return 0;
25 }

 

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

 

标签:10,Lazy,Cow,贝茜,矩阵,USACO,样例,2005,1000
来源: https://www.cnblogs.com/rcxzsc/p/10546040.html