传送门咕咕咕了
这道题实际上只需要计算每个点的左,左上和上方的最大值+1就好了
code:
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <string>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
using namespace std;
int a[105][105];
int n,m;
int ans;
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) cin>>a[i][j];
}
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) {
if(a[i][j]==0) continue;
a[i][j]=min(a[i][j-1],min(a[i-1][j-1],a[i-1][j]))+1;
}
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) ans=max(ans,a[i][j]);
cout<<ans;
return 0;
}