求一个矩阵中最大的2*2矩阵(元素和最大)的和
编程题在线编程题30分2/2
最大子矩阵
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Problem Description:
求一个矩阵中最大的2*2矩阵(元素和最大)的和。
如:
1 2 0 3 4
2 3 4 5 1
1 1 5 3 0
中最大的是:
4 5
5 3
和为17
输入
m*n的矩阵
输出
该m*n矩阵的最大2*2子矩阵(元素和最大)的和
样例输入
1 2 0 3 4 ; 2 3 4 5 1 ; 1 1 5 3 0
样例输出
17
最大子矩阵
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Problem Description:
求一个矩阵中最大的2*2矩阵(元素和最大)的和。
如:
1 2 0 3 4
2 3 4 5 1
1 1 5 3 0
中最大的是:
4 5
5 3
和为17
输入
m*n的矩阵
输出
该m*n矩阵的最大2*2子矩阵(元素和最大)的和
样例输入
1 2 0 3 4 ; 2 3 4 5 1 ; 1 1 5 3 0
样例输出
17
HDU CS505实验室,与各位共享~
分析:假设输入的字符串被分割为row x col的矩阵。基本思想,以2x2的方框,遍历这个矩阵。生成一个(row-1)*(col-1)的结果矩阵。遍历这个新矩阵,得到最大值。此时可以直接输出最大值,如果要输出产生最大值的2x2矩阵,那么需要得到这个最大值在新矩阵的坐标。这个坐标就是原矩阵中2x2方框左上角的坐标。
直接上代码(java实现):
1 package javaTest; 2 3 import java.util.Scanner; 4 5 public class test { 6 7 public static void main(String[] args){ 8 // TODO Auto-generated method stub 9 Scanner scanner = new Scanner(System.in); 10 String inputString = scanner.nextLine(); 11 12 //get matrix 13 int[][] matrix = getMatrix(inputString); 14 int[] rowcol=getXY(matrix); 15 int row=rowcol[0]; 16 int col=rowcol[1]; 17 try { 18 System.out.print(matrix[row][col]+matrix[row][col+1]+matrix[row+1][col]+matrix[row+1][col+1]); 19 } catch (Exception e) { 20 // TODO: handle exception 21 } 22 scanner.close(); 23 } 24 //根据输入的字符串得到新字符 25 static int[][] getMatrix(String str){ 26 int[][] matrix; 27 String[] lineStrArray = str.split(";"); 28 String[] charArrayStrings = lineStrArray[0].split(" "); 29 30 int row = lineStrArray.length; 31 int col = charArrayStrings.length; 32 matrix = new int[row][col]; 33 for(int i=0;i<row;i++) 34 for(int j=0;j<col;j++){ 35 String[] ArrayStrings = lineStrArray[i].split(" "); 36 try{ 37 matrix[i][j]=Integer.parseInt(ArrayStrings[j]); 38 } 39 catch(Exception e){ 40 41 } 42 } 43 return matrix; 44 } 45 46 static int[] getXY(int[][] matrix){ 47 int row = matrix.length; 48 int col = matrix[0].length; 49 //get results 50 int[][] result=new int[row-1][col-1]; 51 for(int i=0,k=0;i<row-1;i++){ 52 for(int j=0;j<col-1;j++){ 53 int r=matrix[i][j]+matrix[i][j+1]+matrix[i+1][j]+matrix[i+1][j+1]; 54 result[i][j]=r; 55 } 56 } 57 int[] index = getMaxIndex(result); 58 59 int[] rowcol=new int[2]; 60 rowcol[0] = index[0]; 61 rowcol[1] = index[1]; 62 return rowcol; 63 } 64 65 static int[] getMaxIndex(int[][] result){ 66 int[] rowcol=new int[2]; 67 int max=result[0][0]; 68 int maxI=0,maxJ=0; 69 for(int i=1;i<result.length;i++){ 70 for(int j=0;j<result[0].length;j++){ 71 if(max<result[i][j]){ 72 max = result[i][j]; 73 maxI=i; 74 maxJ=j; 75 } 76 } 77 } 78 rowcol[0]=maxI; 79 rowcol[1]=maxJ; 80 return rowcol; 81 } 82 }