洛谷P1387 最大正方形【DP】

題目鏈接:P1387 最大正方形

程序說明:

參考了Ice_teapoy大佬的題解 第一個題解。f[i][j]表示a[i][j]左上角的最大正方形邊長。f[i][j] 由 f[i - 1][j],f[i][j - 1],f[i - 1][j - 1] 三者的最小值轉移過來。爲什麼是最小值?因爲比最小值大的話就一定包含0了。三者取最小可以用兩個min函數。

代碼如下:

#include <iostream>
using namespace std;

const int N = 110;
int a[N][N], f[N][N], n, m, res;

int main() {
	cin>>n>>m;
	for(int i = 1; i <= n; i++)	
		for(int j = 1; j <= m; j++)
			cin>>a[i][j];
	
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; 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;
				res = max(res, f[i][j]);
			}							
	cout<<res;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章