我觉得靠自己做动态规划!
然而还是错了
最后看了题解 发现状态转移方程错了 我的式子最后找到的是 最大长方形。。
挺好理解的 感觉比II简单
代码如下
#include<iostream>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<string>
using namespace std;
#define in = read();
typedef long long ll;
typedef unsigned int ui;
const ll size = 100 + 10;
int n , m;
int map[size][size];
int ans = 1;
int f[size][size];
inline ll read(){
ll num = 0 , f = 1; char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') f = -1;
ch = getchar();
}
while(isdigit(ch)){
num = num*10 + ch - '0';
ch = getchar();
}
return num*f;
}
int main(){
n in; m in;
for(register int i=1;i<=n;i++)
for(register int j=1;j<=m;j++){
map[i][j] in;
if(map[i][j] == 1)
f[i][j] = 1;
}
for(register int i=1;i<=n;i++)
for(register int j=1;j<=m;j++)
if(map[i - 1][j] == map[i][j] && map[i][j - 1] == map[i][j] && map[i - 1][j - 1] == map[i][j] && map[i][j] == 1){
f[i][j] = min(f[i - 1][j - 1] , min(f[i - 1][j] , f[i][j - 1])) + 1;
ans = max(ans , f[i][j]);
}
/*
cout<<endl;
for(register int i=1;i<=n;i++){
for(register int j=1;j<=m;j++)
cout<<f[i][j]<<" ";
cout<<endl;
}*/
printf("%d" , ans);
}
//COYG