沈阳模板 网站建设,天津公众号开发,网站建设3d插件,手工制作书签简单又好看题目描述
在一个 n m n\times m nm 的只包含 0 0 0 和 1 1 1 的矩阵里找出一个不包含 0 0 0 的最大正方形#xff0c;输出边长。
输入格式
输入文件第一行为两个整数 n , m ( 1 ≤ n , m ≤ 100 ) n,m(1\leq n,m\leq 100) n,m(1≤n,m≤100)#xff0c;接下来 n n n…题目描述
在一个 n × m n\times m n×m 的只包含 0 0 0 和 1 1 1 的矩阵里找出一个不包含 0 0 0 的最大正方形输出边长。
输入格式
输入文件第一行为两个整数 n , m ( 1 ≤ n , m ≤ 100 ) n,m(1\leq n,m\leq 100) n,m(1≤n,m≤100)接下来 n n n 行每行 m m m 个数字用空格隔开 0 0 0 或 1 1 1。
输出格式
一个整数最大正方形的边长。
样例 #1
样例输入 #1
4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1样例输出 #1
2代码如下
int main() {int n, m;cin n m;vectorvectorint matrix(n, vectorint(m)); // 初始化二维数组for (int i 0; i n; i) {for (int j 0; j m; j) {cin matrix[i][j];}}// dp[i][j]表示以matrix[i][j]为右下角的正方形的最大边长vectorvectorint dp(n, vectorint(m, 0)); int maxLen 0;for (int i 0; i n; i) {for (int j 0; j m; j) {if (i 0 || j 0 || matrix[i][j] 0) { // 边界条件如果是第一行或者第一列或者matrix[i][j] 0说明以当前位置为右下角不可能构成正方形dp[i][j] matrix[i][j]; }else {// 以matrix[i][j]为右下角的正方形的最大边长取决于左边、上边、左上边的正方形的最大边长// 为什么取最小值因为只有三个边都是1才能构成一个正方形dp[i][j] min(dp[i - 1][j - 1], min(dp[i][j - 1], dp[i - 1][j])) 1; }maxLen max(maxLen, dp[i][j]); // 更新最大边长}}cout maxLen endl;return 0;
}