洛谷 P1387 最大正方形 題解
阿新 • • 發佈:2017-09-19
turn 個數 lin 簡便 font while pan show 一個
輸出樣例#1:
此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。
題目鏈接:https://www.luogu.org/problem/show?pid=1387
題目描述
在一個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
2
分析:
看到有國家集訓隊的神犇研究過這個問題,做法是懸線法。
不過這題可以直接DP,而且做法非常簡便qwq
出自某dalao的博客。取min保證組出正方形,畫一畫圖大概就能想通。
AC代碼:
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 5 const int MAXN = 105; 6 7 inline void read(int &x) 8 { 9 char ch = getchar(),c = ch;x = 0; 10 while(ch < ‘0‘ || ch > ‘9‘) c = ch,ch = getchar(); 11 while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar(); 12 if(c == ‘-‘) x = -x; 13 } 14 15 inline int min(int a,int b) 16 {return a<b?a:b;} 17 18 int n,m,ans,mp[MAXN][MAXN],f[MAXN][MAXN];19 20 int main() 21 { 22 read(n),read(m); 23 for(int i = 1;i <= n;++ i) 24 for(int j = 1;j <= m;++ j) 25 { 26 read(mp[i][j]); 27 if(mp[i][j]) f[i][j] = min(f[i-1][j-1],min(f[i-1][j],f[i][j-1]))+1; 28 if(f[i][j] > ans) ans = f[i][j]; 29 } 30 printf("%d\n",ans); 31 return 0; 32 }
洛谷 P1387 最大正方形 題解