休闲题
一道大水题,直接枚举每个点作为驻扎地,然后利用前缀和求出答案,取max就好了,复杂度(O(N^3))
(要不是标签是蓝色我2min内绝对能切掉,假的难度导致我思考的过于复杂,7min才想出来)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<cstring>
#include<vector>
#include<stack>
using namespace std;
const int maxn=406;
int mat[maxn][maxn],sum[maxn][maxn],n,kk;
int main()
{
cin>>n>>kk;
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
{
scanf("%d",&mat[i][j]);
sum[i][j]=sum[i][j-1]+mat[i][j];
}
int ans=0;
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
{
int tmp=sum[i][min(j+kk,n)]-sum[i][max(j-kk,1)-1];
int cnt=kk;
for (int k=1;k<=kk;++k)
{
if (i-k<1) break;
cnt--;
tmp+=sum[i-k][min(j+cnt,n)]-sum[i-k][max(j-cnt,1)-1];
}
cnt=kk;
for (int k=1;k<=kk;++k)
{
if (i+k>n) break;
cnt--;
tmp+=sum[i+k][min(j+cnt,n)]-sum[i+k][max(j-cnt,1)-1];
}
ans=max(ans,tmp);
}
cout<<ans;
}
收获:
通过做水题,发现自己容易想麻烦,要暴力一点qwq