最大正方形 同luogu1387

这道题下面这么写就够了(n<=100)暴力,枚举

#include<bits/stdc++.h>
#define ULL unsigned long long
#define MAXN 100+5
#define f(i,j,n) for(register int i=j;i<=n;i++)
using namespace std;
ULL T,a[MAXN][MAXN],n,m;
int q(int i,int j,int k,int l) {
    f(p,i,j)
    f(q,k,l)
    if(a[p][q]==0) return 0;
    return min(j-i+1,l-k+1);
}
void solve(int T) {
    int ans=0;
    while(T--) {
        memset(a,0,sizeof(a));
        cin>>n>>m;
        f(i,1,n)
        f(j,1,m) {
            int x;
            cin>>x;
            a[i][j]=x;
        }
        f(i,1,n)
        f(j,i,n)
        f(k,1,m)
        f(l,k,m)
        ans=max(ans,q(i,j,k,l));
        cout<<ans<<endl;
    }
}
int main() {
    solve(1);
    return 0;
}

然后如果说要提升的话(n<=1000) 二维前缀和

#include<iostream>
    #include<cstdio>
    #include<cctype>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int n,m,map[105][105];
    int sum[105][105];
    void pre(){
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+map[i][j];  
    }
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&map[i][j]);
        pre();
        int ans=-1;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                for(int l=1;l<=min(n,m);l++){
                    int rx=i+l-1,ry=j+l-1;
                    if(i-1+l>n||j-1+l>m||sum[rx][ry]-sum[rx][j-1]-sum[i-1][ry]+sum[i-1][j-1]!=l*l) break;
                    if(ans<l) ans=l;
                }
        printf("%d",ans);
        return 0;
    }

然后在提升->(n<=5000)动态规划 DP

#include<bits/stdc++.h>
using namespace std;
int a[105][105],f[101][101],ans;
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>a[i][j];
            if(a[i][j]==1) f[i][j]=min(min( f[i][j-1],f[i-1][j]),f[i-1][j-1])+1;
            {
                ans=max(ans,f[i][j]);
            }
        }
    }
    cout<<ans;
    return 0;
}
posted @ 2019-02-24 15:47  Isaunoya  阅读(120)  评论(0编辑  收藏  举报
TOP