[USACO14MAR]懒惰的牛The Lazy Cow_Sliver

休闲题

一道大水题,直接枚举每个点作为驻扎地,然后利用前缀和求出答案,取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

posted @ 2018-09-25 20:52  Splitor  阅读(377)  评论(0编辑  收藏  举报