1. 程式人生 > >P1387 最大正方形(DP)

P1387 最大正方形(DP)

題目:
在一個n*m的只包含0和1的矩陣裡找出一個不包含0的最大正方形,輸出邊長。
輸入輸出樣例
輸入樣例#1: 複製
4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1
輸出樣例#1: 複製
2

題解:
只有當前位置為1時,正方形長度才可以更大。而要使得正方形最大,左,上,左上都為一,否則為他們三個裡面最小的那個加1.所以狀態轉移方程為:
f[i][j]=min(min(f[i-1][j],f[i][j-1]),f[i-1][j-1])+1;

程式碼:

#include<stdio.h>
#include<stdlib.h>
#include<math.h> #include<string.h> #include<algorithm> #include<iostream> #include<queue> #include<stack> #include<cstdio> #include<cstring> #include<vector> #include<cmath> #include<map> #define exp 1e-9 #define PI acos(-1.0) #define INF 0x3f3f3f3f
using namespace std; typedef long long LL; int a[101][101]; int f[101][101]; int main() { int n,m,i,j,maxx=-1; scanf("%d%d",&n,&m); memset(f,0,sizeof(f)); for(i=1;i<=n;i++) for(j=1;j<=m;j++) { scanf("%d",&a[i][j]); if(a[i][j]==1) f[i][j]=min(min(f[i-1
][j],f[i][j-1]),f[i-1][j-1])+1; maxx=max(maxx,f[i][j]); } printf("%d\n",maxx); return 0; }