求一个矩阵中最大的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

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 }
时间: 2024-12-22 07:49:16

求一个矩阵中最大的2*2矩阵(元素和最大)的和的相关文章

【编程题目】求一个矩阵中最大的二维矩阵(元素和最大)

35.(矩阵)求一个矩阵中最大的二维矩阵(元素和最大).如:1 2 0 3 42 3 4 5 11 1 5 3 0中最大的是:4 55 3要求:(1)写出算法;(2)分析时间复杂度;(3)用 C 写出关键代码 早上灭小题! /* 35.(矩阵) 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 0 3 4 2 3 4 5 1 1 1 5 3 0 中最大的是: 4 5 5 3 要求:(1)写出算法;(2)分析时间复杂度;(3)用 C 写出关键代码 */ #include <stdio.h>

IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)

问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10 分析: 2*2子数组的最大和.遍历求和,时间复杂度为O(mn). 代码实现: 1 // 35.cc 2 #include <iostream> 3 #include <climits> 4 using namespace std; 5 6 int find_max(int (*a)[5], int m, int n) { 7 in

求一个字符串中连续出现次数最多的子串

解题思路 例如字符串"abababc",最多连续出现的为ab,连续出现三次.要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复子串为abab.两个题目的解法有些类似,都用到了后缀数组这个数据结构.求一个字符串中连续出现的次数最多的子串,首先生成后缀数组例如上面的字符串为: abababc bababc ababc babc abc bc c 可以看出第一个后缀数组和第三个后缀数组的起始都为ab,第5个后缀数组也为ab.可以看出规律来,一个字符串s,如果第一次出现

spoj 694 求一个字符串中不同子串的个数

SPOJ Problem Set (classical) 694. Distinct Substrings Problem code: DISUBSTR Given a string, we need to find the total number of its distinct substrings. Input T- number of test cases. T<=20; Each test case consists of one string, whose length is <=

求一个字符串中连续出现最多的子串次数

时间:2014.09.12 地点:基地 心情:明天就要和欧阳去武汉面试阿里了,整理一下同学求助的一道题,写下这一篇,愿一切顺利. 一.题目: 求一个字符串中连续出现最多的子串次数:例如字符串abcbcbcabc,连续出现次数最多的子串是bc,出现次数为3. 二.分析 方法:后缀思路 比如题目中举例中的字符串,它的后缀有: abcbcbcabc  0 bcbcbcabc  1 cbcbcabc  2 bcbcabc  3 cbcabc  4 bcabc  5 cabc  6 abc  7 bc  

巧妙利用快速排序法的原理求一个数组中的第10大元素

//快速排序法 int QuickSort_process3(int *a, int low, int high) { int l, h, temp; l = low; h = high; temp = a[low]; while (l < h){ while (l< h&&a[h] >= temp) --h; if (l < h) a[l] = a[h]; while (l < h&&a[l] < temp) ++l; if (l &l

判欧拉回路或求一个图中欧拉图的个数

判欧拉图两个条件首先联通,其次度全部为欧度.那么就很easy了. 题目:hdoj1878 求一个图中欧拉图的个数. 首先通过连通性求出各个子图,然后求子图中奇数度的个数cnt,cnt/2为欧拉图的个数.若子图没有奇数度,则为一个欧拉回路. 题目:hdoj3018Ant Trip 注意这个题目中可能出现孤立点,不算入欧拉图中. AC代码: include include include include include include include include include include

求一个序列中两个只出现一次的数

当然了,O(1)空间复杂度是必须的... 先看一个简单版: 求出一个序列中一个只出现一次的数 COJ 1217 奇数个的那个数 http://122.207.68.93/OnlineJudge/problem.php?id=1217 我们知道任意两个相同的数 异或结果为0  任何数与0异或结果是其本身  异或运算满足交换律 亦即:a^a=0     a^0=a      (a^b)^(a^b)=(a^a)^(b^b)=0^0=0 这样我们就得到了一个用异或运算的解法 1 #include<std

求一个字符串中连续出现的次数最多的子串

求一个字符串中连续出现的次数最多的子串.例如字符串“abababc”,最多连续出现的为ab,连续出现三次.要和求一个字符串中的最长重复子串区分开来,还是上面的字符串,那么最长的重复子串为abab.两个题目的解法有些类似,都用到了后缀数组这个数据结构.求一个字符串中连续出现的次数最多的子串,首先生成后缀数组例如上面的字符串为:abababcbababcababcbabcabcbcc可以看出第一个后缀数组和第三个后缀数组的起始都为ab,第5个后缀数组也为ab.可以看出规律来,一个字符串s,如果第一次