您的位置:首页 > 编程语言 > Java开发

ACM Poj1050 To the Max 求矩阵中局部矩形区域和最大值 java版本

2017-05-02 13:16 363 查看
今天又刷了一道poj上面的水题。

题目的要求大致如下:

给定一个矩阵,求出其包含的矩形区域的最大值(矩形区域总所包含的所有元素都要算)。具体如下:
            0 -2 -7 0 

            9 2 -6 2       最大值区域:        9   2

           -4 1 -4 1                           -4   1

           -1 8 0 -2                           -1   8
 
这个题思路比较简单,通过暴力枚举求出最大的那个矩形区域就可以了,并没有要求输出这个区域的数据(如果要求输出的话在题目中加一个二维数组随时记录Max所在的区域就可以了吧,我也没有做,所以大家可以自己尝试一下)。这个题用多重循环就可以作出来咯。
我的思路如下(如果大家能想清楚的话这道题确实很简单的,希望的的思路表达能够让大家清楚):

第一重循环:从第一行循环到最后一行 (比如是i行,能够遍历出所有以i行元素开始的子矩阵)

第二重循环:从每一行的第一列循环到最后一列(比如是j列,能够遍历出所有以i行j列元素开始的子矩阵)

第三重循环:从这一行的这一列开始一只循环到最后一列(此时j2 从j一直循环到最后一列,能够遍历出所有i行j列开始到i行j2列结束的所有子矩阵)

第四重循环:从这一行的跨越几列的1*n的区域循环到最后一行(此时k 从i行一直循环到最后一行,能够遍历出所有宽度为:i行j列开始到i行j2列结束;高度为:i行开始,k行结束的所有子矩阵)

当然,如果在4重循环中再去计算每一行中的宽度矩阵的和的话会导致超时,所有我就想着利用一个等大的二维数组将map(存放矩阵数据的二维数组)中第i行的前j个数据的和存放起来,在计算的时候能够直接相减得到需要的数据,可AC的代码如下:

import java.util.Scanner;
public class Main {
private static int num;
private static int map[][];
private static int store[][];
private static int max=0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
num = sc.nextInt();
map = new int[num][num];
store = new int[num][num];
for (int i = 0; i < num; i++) {//输入数据
for (int j = 0; j < num; j++) {
map[i][j] = sc.nextInt();
for (int j2 = 0; j2 <= j; j2++) {
store[i][j] += map[i][j2];
}
}
}
for (int i = 0; i < num; i++) {//遍历每一行
for (int j = 0; j < num; j++) {//遍历这一行的所有列
for (int j2 = j; j2 < num; j2++) {//从这一列开始遍历后面的所有列
int temp = 0;
for (int k = i; k < num; k++) {
if (j == j2) {//只有一列
temp += map[k][j];
if (max<temp) {
max = temp;
continue;
}
}else{
temp += store[k][j2] - store[k][j] + map[k][j];
if (max < temp)
max = temp;
}
}

}

}

}
System.out.println(max);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: