最大正方形 同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;
}
不存在十全十美的文章 如同不存在彻头彻尾的绝望