1. 程式人生 > >洛谷 P1387 最大正方形

洛谷 P1387 最大正方形

兩種 節點 cin 包含 min ont namespace class 代碼

題目描述

在一個n*m的只包含0和1的矩陣裏找出一個不包含0的最大正方形,輸出邊長。

輸入輸出格式

輸入格式:

輸入文件第一行為兩個整數n,m(1<=n,m<=100),接下來n行,每行m個數字,用空格隔開,0或1.

輸出格式:

一個整數,最大正方形的邊長

輸入輸出樣例

輸入樣例#1:
4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1
輸出樣例#1:
2
解題思路:
一道DP題,用一個f[i][j]表示以(i,j)為正方形的右下頂點的邊長,只有當a[i][j] = 1時,(i,j)才能作為正方形的右下角,對於一個已經確定的f[i][j]=x,它表明包括節點i,j在內向上x個節點,向左x個節點掃過的正方形中所有a值都為1;
狀態轉移方程:
f[i][j] = min(min(f[i][j-1],f[i-1][j]),f[i-1][j-1]) + 1;(a[i][j] == 1).
AC代碼:
 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 int n,m,f[105][105],ans;
 5 bool a[105][105];//因為只有0、1兩種情況,用bool即可,節省空間
 6 int main()
 7 {
 8     scanf("%d%d",&n,&m);
 9     for(int i = 1;i <= n; i++)
10 for(int j = 1;j <= m; j++) 11 cin >> a[i][j];//存圖 12 for(int i = 1;i <= n; i++) 13 for(int j = 1;j <= m; j++) 14 if(a[i][j])//當a[i][j] == 1時 15 f[i][j] = min(min(f[i][j-1],f[i-1][j]),f[i-1][j-1]) + 1, ans = max(ans,f[i][j]);
16 //在(i,j)的上方、左方、左上方找一個邊長最小的加1,更新f[i][j]的狀態,並用ans更新答案 17 printf("%d",ans); 18 return 0; 19 }

 

洛谷 P1387 最大正方形