思路很明确,但是也有两个坑
1.对角线包括左对角线和右对角线
2.每个状态由三个值来取最小值,如图。
一开始没有考虑绿色,导致类似这样的数据
4 4
1 0 0 1
0 1 0 0
0 0 1 0
1 0 0 1
最后dp[4][4]的值为1,而正确答案是为3。也就是说,它可以继承上一个状态的一部分
#include<bits/stdc++.h>
using namespace std;
#define mxn 2501
int dp[mxn][mxn]={0};
int a[mxn][mxn];
int main(void){
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
dp[i][j]=a[i][j];
}
}
int mx=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]&&i>1&&j>1){
int k=1;
for(k=1;k<=dp[i-1][j-1];k++){
if(a[i-k][j]||a[i][j-k]){
break;
}
}
dp[i][j]=max(dp[i][j],k);
}
if(a[i][j]&&i>1&&j<m){
int k=1;
for(k=1;k<=dp[i-1][j+1];k++){
if(a[i-k][j]||a[i][j+k]){
break;
}
}
dp[i][j]=max(dp[i][j],k);
}
mx=max(mx,dp[i][j]);
}
}
// int mx=0;
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// printf("%d ",dp[i][j]);
// }
// printf("\n");
// }
printf("%d",mx);
}