P1387 最大正方形(DP)
阿新 • • 發佈:2018-11-09
題目:
在一個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;
}