题目大意:给出一个矩阵,选一个点,从这个点可以走K步,问最后选哪个点可以得到的最大值是多少?
因为好久没做题了…现在整个人是个憨的状态,这题是个多维前缀和,但是不是那种常规的2维,而是被分成了N层的1维前缀和,这样我们就可以针对每行求出左边和右边的界限,然后前缀和加起来就可以了
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN 505
using namespace std;
int N, K;
int a[MAXN][MAXN],sum[MAXN][MAXN];
int main()
{
int i, j, k;
cin>>N>>K;
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
cin>>a[i][j];
}
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
{
sum[i][j]=sum[i][j-1]+a[i][j];
}
}
int ans=0;
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
{
int temp=0;
for(k=i;k>=max(1,i-K);k--)
{
int v=(K-(i-k));
int l=max(0,j-v-1);
int r=min(N,j+v);
temp+=sum[k][r]-sum[k][l];
}
for(k=i+1;k<=min(N,i+K);k++)
{
int v=(K-(k-i));
int l=max(0,j-v-1);
int r=min(N,j+v);
temp+=sum[k][r]-sum[k][l];
}
// cout<<temp<<endl;
ans=max(ans,temp);
}
}
cout<<ans<<endl;
}