(File IO): input:lazy_silver.in output:lazy_silver.out
時間限制: 1000 ms 空間限制: 128000 KB 具體限制
題目描述
夏天到了,奶牛貝里斯又開始變得懶惰起來。他想要站在一個地方,然後喫掉一定範圍內的所有青草。貝里斯所在的田地可以描述爲一個N*N的方陣,對於方陣中的第行和第列上的數字,表示這個小方格中青草的數量。貝里斯會在方陣中選擇一個初始位置(小方格),然後以這個位置爲起點經過的步數不超過K的地方的青草都將被貝里斯喫掉。每走一步,就是走到相鄰(上下左右直接相鄰)的其中一個小方格中去。例如,有一個方陣如圖所示,貝里斯的初始位置是,有標示的地方。
如果,那麼貝里斯只能走到號所標示的地方。如果初始的位置可以選擇的話,請幫助貝里斯計算他最多能喫到的青草的數量。
輸入
第一行是兩個正整數和。
接下里行,每行個整數,表示方陣。
輸出
貝里斯最多能喫到的青草的數量。
樣例輸入
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
樣例輸出
342
數據範圍限制
。
提示
樣例中,如果貝里斯的初始位置是的話,他能喫到最多的青草數量是。
解題思路
可以採用前綴和,然後枚舉求出一這個點爲中心,k步的值。
__
代碼
#include<bits/stdc++.h>
using namespace std;
int n,k,a[410][820],b[410][820],x,y,s,o,o1,maxn,ans;
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;
o=i-k;
if (o<1) o=1;//行的上限
o1=i+k;
if (o1>n) o1=n;//行的下限
for(int z=o; z<=o1; z++)
{
s=abs(i-z);//已經走了多少步
x=min(j+k-s,n);//列的最右邊
y=max(j-k+s,1);//列的最左邊
ans+=b[z][x]-b[z][y-1];//累加
}
maxn=max(maxn,ans);//記錄最大值
}
}
printf("%d",maxn);
}