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的代码如下:
题目的要求大致如下:
给定一个矩阵,求出其包含的矩形区域的最大值(矩形区域总所包含的所有元素都要算)。具体如下:
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); } }
相关文章推荐
- poj 1050 To the Max 求矩阵中局部矩形区域和最大值
- hdu 1081 To The Max最大矩阵和(动态规划)
- 1081 To The Max【最大子矩阵】
- poj 1050 To the Max 二维矩阵转换一维求子序列最大值
- hdu 1081 To The Max(子矩阵最大和)
- HDU 1003 Max Sum && HDU 1081 To The Max 一维子串最大和& 二维矩阵最大和
- poj 1050 To the Max(最大子矩阵之和)
- zoj 1074 To the Max 最大子矩阵之和
- poj 1050 To the Max(最大子矩阵之和)
- HDU 1081 To The Max【DP】【最大子段矩阵求和】
- [POJ1050]To the Max(最大子矩阵,DP)
- Poj 1050 To the Max (最大子矩阵 DP)
- POJ1050_To the Max_求最大子矩阵_DP
- HDU-1081 To The Max -----求子矩阵最大和
- poj 1050 To the Max(最大子矩阵之和,基础DP题)
- POJ 1050 To the Max(最大字矩阵)【模板】
- POJ 1050 To the Max【最大子矩阵】
- HDU1081:To The Max(最大子矩阵,线性DP)
- pku1050----To the Max(求矩阵的最大子段和)
- poj1050-To the Max-最大子矩阵-dp