最大正方形子矩阵
2016-10-05 06:31
387 查看
【题目描述】
在一个01矩阵中,包含有很多的正方形子矩阵,现在要求出这个01矩阵中,最大的正方形子矩阵,使得这个正方形子矩阵中的某一条对角线上的值全是1,其余的全是0。
【输入描述】
第一行有两个整数n和m(1 <= n,m <= 1000)。接下来的n行,每行有m个0或1的数字。每两个数字之间用空格隔开。
【输出描述】
输出一个整数,表示满足条件的最大正方形子矩阵的边长。
【样例输入】
4 6
0 1 0 1 0 0
0 0 1 0 1 0
1 1 0 0 0 1
0 1 1 0 1 0
【样例输出】
3
在一个01矩阵中,包含有很多的正方形子矩阵,现在要求出这个01矩阵中,最大的正方形子矩阵,使得这个正方形子矩阵中的某一条对角线上的值全是1,其余的全是0。
【输入描述】
第一行有两个整数n和m(1 <= n,m <= 1000)。接下来的n行,每行有m个0或1的数字。每两个数字之间用空格隔开。
【输出描述】
输出一个整数,表示满足条件的最大正方形子矩阵的边长。
【样例输入】
4 6
0 1 0 1 0 0
0 0 1 0 1 0
1 1 0 0 0 1
0 1 1 0 1 0
【样例输出】
3
源代码: #include<cstdio> int m,n,ans(0),i[1001][1001]={0},f1[1001][1001]={0},f2[1001][1001]={0},h1[1001][1001]={0},h2[1001][1001]={0}; int main() { scanf("%d%d",&m,&n); for (int a=1;a<=m;a++) for (int b=1;b<=n;b++) { scanf("%d",&i[a][b]); h2[a][b]=h1[a][b]=i[a][b]; //初始化“和之数组”。 } for (int a=1;a<=n;a++) h1[1][a]+=h1[1][a-1]; for (int a=n;a>0;a--) h2[1][a]+=h2[1][a+1]; for (int a=1;a<=n;a++) f2[1][a]=f1[1][a]=i[1][a]; //对第一行进行预处理。 for (int a=2;a<=m;a++) for (int b=1;b<=n;b++) //对后方进行处理。 { h1[a][b]+=h1[a-1][b]+h1[a][b-1]-h1[a-1][b-1]; //对区域和进行处理。 if (i[a-1][b-1]) f1[a][b]=f1[a-1][b-1]+1; if (f1[a][b]==(h1[a][b]-h1[a][b-f1[a][b]]-h1[a-f1[a][b]][b]+h1[a-f1[a][b]][b-f1[a][b]])&&f1[a][b]>ans) //若1の数量=区域和,则符合题意。 ans=f1[a][b]; } for (int a=2;a<=m;a++) //同理于上。 for (int b=n;b>0;b--) //注意,此处应为倒序。 { h2[a][b]+=h2[a-1][b]+h2[a][b+1]-h2[a-1][b+1]; //注意左对角线处理与右对角线处理的区别。 if (i[a-1][b+1]) f2[a][b]=f2[a-1][b+1]+1; if (f2[a][b]==(h2[a][b]-h2[a][b+f2[a][b]]-h2[a-f2[a][b]][b]+h2[a-f2[a][b]][b+f2[a][b]])&&f2[a][b]>ans) ans=f2[a][b]; } printf("%d",ans); return 0; }
相关文章推荐
- 2D矩阵求最大正方形子矩阵,各项元素为1
- 最大子段和||最大子矩阵和||最大全1子矩阵||最大全1子正方形||
- 01矩阵最大正方形
- 【BZOJ1057】【ZJOI2007】棋盘制作 最大01子矩阵/正方形
- 2163 最大正方形子矩阵
- 一个M*N的矩阵,元素取值1或0,问如何找到最大的正方形,其所有的元素都为1
- 矩阵动归--最大正方形
- 【难】【DP】计算bool矩阵中,仅包含1的最大矩形和最大正方形
- 数组与矩阵---边界都是1的最大正方形大小
- vojos 1055,1057 最大子矩阵、正方形
- 华为机考 给你一个N*M的矩阵,每个位置的值是0或1,求一个面积最大的子矩阵,这个矩阵必须是一个正方形,且里面只能由1构成,输出最大的正方形边长。其中n,m<=400;
- 求01矩阵中的最大的正方形面积
- 一个M*N的矩阵,元素取值1或0,问如何找到最大的正方形,其所有的元素都为1
- 221. Maximal Square -- 矩阵中1组成的最大正方形
- 在矩阵中寻找最大正方形连续区域
- LeetCode: 221_Maximal Square | 二维0-1矩阵中计算包含1的最大正方形的面积 | Medium
- 0 1 矩阵查找最大正方形
- [LeetCode] 01矩阵中最大正方形 Maximal Square
- DP---求给定矩阵中最大正方形的维度
- 最大子段和||最大子矩阵和||最大全1子矩阵||最大全1子正方形||