zoukankan      html  css  js  c++  java
  • 最大正方形 同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;
    }
    不存在十全十美的文章 如同不存在彻头彻尾的绝望
  • 相关阅读:
    ASP.NET的单值绑定
    ASP+SQL 文件、目录,文本文件等多种操作类
    Access转换为 MS SQL 有什么要注意的地方
    ASP的一些珍藏代码
    SQL SERVER的数据类型
    .Net 文件名后缀的详细解释
    JSF(JavaServer Faces)学习手册-入门篇(1.1)
    xManager登录HP_UX出现乱码
    Tomcat常用调优技巧
    JSF(JavaServer Faces)学习手册-入门篇-参考文献
  • 原文地址:https://www.cnblogs.com/qf-breeze/p/10426460.html
Copyright © 2011-2022 走看看