华为机试真题 Java 实现最大矩阵和
Posted MISAYAONE
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为机试真题 Java 实现最大矩阵和相关的知识,希望对你有一定的参考价值。
目录
题目
给定一个二维整数矩阵,要在这个矩阵中选出一个子矩阵,使得这个子矩阵内所有的数字和尽量大,我们把这个子矩阵称为和最大子矩阵,子矩阵的选取原则是原矩阵中一块相互连续的矩形区域。
输入描述:
输入的第一行包含2个整数n, m(1 <= n, m <= 10),表示一个n行m列的矩阵,下面有n行,每行有m个整数,同一行中,每2个数字之间有1个空格,最后一个数字后面没有空格,所有的数字的在[-1000, 1000]之间。
输出描述:输出一行一个数字,表示选出的和最大子矩阵内所有的数字和。
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例输入
3 4
-3 5 -1 5
2 4 -2 4
-1 3 -1 3
输出
20
说明
一个3*4的矩阵中,后面3列的子矩阵求和加起来等于20,和最大。
思路
1:从题目中来看,因为已经限制了矩阵最大就是10X10的,所以暴力破解也就成了可能,我们就直接遍历所有的子矩阵,看看谁最大就可以了。
考点
1:暴力法
Code
import java.util.Scanner;
import java.util.*;
public class Main
public static void main(String[] args)
// 处理输入
Scanner in = new Scanner(System.in);
int m, n;
// 限定长度为10
int matrix[][] = new int[10][10];
int sum[][] = new int[10][10];
n = in.nextInt();
m = in.nextInt();
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
matrix[i][j] = in.nextInt();
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
sum[i][j] = matrix[i][j];
if (i != 0)
sum[i][j] += sum[i - 1][j];
if (j != 0)
sum[i][j] += sum[i][j - 1];
if (i != 0 && j != 0)
sum[i][j] -= sum[i - 1][j - 1];
int result = matrix[0][0];
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
for (int ri = i; ri < n; ri++)
for (int rj = j; rj < m; rj++)
int temp = sum[ri][rj];
if (i != 0)
temp -= sum[i - 1][rj];
if (j != 0)
temp -= sum[ri][j - 1];
if (i != 0 && j != 0)
temp += sum[i - 1][j - 1];
if (temp > result)
result = temp;
System.out.println(result);
以上是关于华为机试真题 Java 实现最大矩阵和的主要内容,如果未能解决你的问题,请参考以下文章