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