题目描述
这是一个炎热的夏天,奶牛贝茜感觉到相当的疲倦而且她也特别懒惰。她要在她的领域中找到一个合适的位置吃草,让她能吃到尽可能多的美味草并且尽量只在很短的距离。
奶牛贝茜居住的领域是一个 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会炸...