1387 最大正方形
难度:普及/提高-
题目类型:动规
提交次数:1
涉及知识:多维动规
题目描述
在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长。
输入输出格式
输入格式:
输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m个数字,用空格隔开,0或1.
输出格式:
一个整数,最大正方形的边长
代码:
1 #include<iostream> 2 using namespace std; 3 int d[105][105]; 4 int minn(int a, int b, int c){ 5 return min(a, min(b, c)); 6 } 7 int main(){ 8 int n; 9 cin>>n; 10 int i, j; 11 for(i = 1; i <= n; i++) 12 for(j = 1; j <= n; j++) 13 cin>>d[i][j]; 14 int maxx = 0; 15 for(i = 1; i <= n; i++){ 16 for(j = 1; j <= n; j++){ 17 if(d[i][j] == 1){ 18 d[i][j] = minn(d[i-1][j], d[i][j-1], d[i-1][j-1])+1; 19 maxx = max(maxx, d[i][j]); 20 } 21 } 22 } 23 cout<<maxx; 24 return 0; 25 }
备注:
d[i][j] 表示以(i,j)为右下角的最大正方形的边长。状态转移方程式d[i][j]=min(d[i-1][j],d[i][j-1],d[i-1][j-1]) (if d[i][j]==1)。这个道理想想显而易见,却又不是那么理所当然,总之挺奇妙的。这也算是一道典型题目吧。