首页 > 代码库 > 1387 最大正方形
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)。这个道理想想显而易见,却又不是那么理所当然,总之挺奇妙的。这也算是一道典型题目吧。
1387 最大正方形
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。