把握一些小技巧可以使自己的代码简短细致。这个dp利用每个边向外扩展的程度进行状态转移的书写,在开始时没有注意这一点,一直从结果出发,没有重点考虑状态转移的规律而一直写不下来,但这是一个简单的dp。
#include <iostream>
#include <stdio.h>
using namespace std;
int squre[1003][1003],dp[1003][1003];
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m)){
for(int i = 1;i <= m;i ++)
for(int j = 1;j <= n;j ++)
scanf("%d",&squre[i][j]);
int ans = 0;
for(int i = 1;i <= m;i ++)
for(int j = 1;j <= n;j ++){
if(squre[i][j]){
dp[i][j] = min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1])) + 1;
if(dp[i][j] > ans) ans = dp[i][j];
}
else
dp[i][j] = 0;
}
printf("%d\n",ans * ans);
}
return 0;
}