华为机考 给你一个N*M的矩阵,每个位置的值是0或1,求一个面积最大的子矩阵,这个矩阵必须是一个正方形,且里面只能由1构成,输出最大的正方形边长。其中n,m<=400;
来源:互联网 发布:东莞淘宝运营商 编辑:程序博客网 时间:2024/05/01 12:05
借鉴博客 :http://www.bkjia.com/Androidjc/1019264.html
此问题主要是求一个数组的最大连续相同字符的正方形的问题,比如
0 1 1 1 1 1
0 1 1 1 1 1
1 1 1 1 1 1
0 0 0 0 0 0
得出来得的是
输出边长也就是3;
具体思路:
先从a[1][1]开始,循环至结尾,每一次都执行以下循环体:
比较a[]i-1[j-1],a[i][j-1],a[i-1][j],选出最小的,然后加到a[i][j]里,判断全局变量的max是否小于a[i][j],如果是的话,赋值。
代码如下:
/*
* 给你一个N*M的矩阵,每个位置的值是0或1,
* 求一个面积最大的子矩阵,这个矩阵必须是一个正方形,
* 且里面只能由1构成,输出最大的正方形边长。其中n,m<=400;
* */
import java.util.*;
public class juzhen{
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
int m,n;
while(true){
m=sc.nextInt();
n=sc.nextInt();
int[][] a=new int[m][n];
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
a[i][j]=sc.nextInt();
/*测试输出刚才输入的内容
for(int i=0;i<m;i++){
for(int j=0;j<n;j++)
System.out.print(a[i][j]+" ");
System.out.println();
}*/
//通过cout函数求得最大边长
int s=cout(a,m,n);
System.out.println(s);
}
}
//求最大边长的函数
private static int cout(int[][] a, int m, int n) {
// TODO Auto-generated method stub
int max=-1;
for(int i=1;i<m;i++)
for(int j=1;j<n;j++){
if(a[i][j]==1){
int min=a[i-1][j-1];
if(a[i-1][j]<min)
min=a[i-1][j];
if(a[i][j-1]<min)
min=a[i][j-1];
a[i][j]+=min;
if(max<a[i][j])
max=a[i][j];
}
}
return max;
}
}
- 华为机考 给你一个N*M的矩阵,每个位置的值是0或1,求一个面积最大的子矩阵,这个矩阵必须是一个正方形,且里面只能由1构成,输出最大的正方形边长。其中n,m<=400;
- 求一个n*m阶矩阵中为1的矩阵最大面积
- 一个M*N的矩阵,元素取值1或0,问如何找到最大的正方形,其所有的元素都为1
- 一个M*N的矩阵,元素取值1或0,问如何找到最大的正方形,其所有的元素都为1
- 求一个M*N的矩阵的最大子矩阵和。
- 有一个n*n的矩阵,矩阵由 "0"和"1"组成,检测矩阵中的由"1"组成的图形是一个实心的正方形,结果为true或者false
- Educational Codeforces Round 8 E. Zbazi in Zeydabad(给你一个n*m矩阵,每个点可能是'.'或者'z',问有多少种Z子型(Z为一个正方形))
- 求一个矩阵的最大子矩阵
- 求全1的最大正方形的边长 和 全1的最大子矩阵的面积 和POJ 2559 最大直方图
- 求m*n矩阵中最大的子矩阵(元素和最大)
- C++:输入一个数n; 输出的是一个有*和#构成的n*n的正方形; 一圈套一圈~~~~
- 任意给定一个自然数N,要求M是N的倍数,且他的所有各位数字都是由0或1组成,并要求M尽可能小
- 求最大正方形的边长
- 求一个矩阵最大子矩阵的算法模板
- M*N的矩阵
- 将一个n元素的数组平均分为m分,是每组和相等,求最大m
- 最大正方形子矩阵
- 全是1的最大子矩阵
- 计算两个时间戳间隔时间, (可以用于倒计时
- Android studio 制作aar 使用Gradle发布项目到JCenter仓库
- 利用 Composer 一步一步构建自己的 PHP 框架(一)——基础准备
- (七)RxJava定时器:timer
- Swift中In-Out类型的参数
- 华为机考 给你一个N*M的矩阵,每个位置的值是0或1,求一个面积最大的子矩阵,这个矩阵必须是一个正方形,且里面只能由1构成,输出最大的正方形边长。其中n,m<=400;
- 精华阅读第 10 期 |解开阿尔法狗(AlphaGo)人工智能的画皮
- The minimum depth The maximum path sum path sum II
- ios 关于如何消除在向cell中添加图片文字是时出现的重影问题
- Oracle学习(四)----分组函数
- Jfinal中的render
- Eclipse下用Gradle 打包Android 程序
- iOS crash 崩溃问题的追踪方法
- 利用 Composer 一步一步构建自己的 PHP 框架(二)——构建路由