洛谷 P1387 最大正方形
阿新 • • 發佈:2019-02-11
兩種 節點 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 最大正方形