二维矩阵最大值问题
给定一个仅包含0和1的n*n二维矩阵,请计算二维矩阵的最大值。
计算规则如下
1、每行元素按下标顺序组成一个二进制数(下标越大约排在低位),二进制数的值就是该行的值,矩阵各行之和为矩阵的值
2、允许通过向左或向右整体循环移动每个元素来改变元素在行中的位置
比如:[1,0,1,1,1] 向右整体循环移动两位 [1,1,1,0,1], 二进制数为11101 值为29
[1,0,1,1,1] 向左整体循环移动两位 [1,1,1,1,0], 二进制数为11110 值为30
输入描述
1.数据的第一行为正整数,记录了N的大小, 0<N<=20
2.输入的第2到n+1行为二维矩阵信息, 行内元素边角逗号分割
输出描述
矩阵的最大值
示例1
输入
5
1,0,0,0,1
0,0,0,1,1
0,1,0,1,0
1,0,0,1,1
1,0,1,0,1
输出
122
说明第一行向右整体循环移动一位,得到最大值 11000 24 因此最大122
import java.util.*; public class Demo22 { public static void main(String[] args){ Scanner sc = new Scanner(System.in); int N = Integer.parseInt(sc.nextLine()); int sum = 0; for(int i = 0; i < N; i++){ //n行初始输入 String[] temp = sc.nextLine().split(","); LinkedList<String> list = new LinkedList<>(Arrays.asList(temp)); //对单行数据的处理 int max = 0; for(int j = 0; j < N; j++){ list.addLast(list.remove(0)); //String tos = list.toString(); 结果是[0, 0, 0, 1, 1] String tos = list.toString().replaceAll("\\W+",""); int num = Integer.parseInt(tos, 2); if(max < num) max = num; } sum += max; } System.out.println(sum); } }
解法2
package 真题; import java.util.Scanner; public class MaxMatrix { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); in.nextLine(); int total = 0; while (n > 0) { String[] matrix = in.nextLine().split(","); total += deal(matrix); n--; } System.out.println(total); } private static int deal(String[] matrix) { // 主函数中调用自定义函数要加static int max = 0; for (int i = 0; i < matrix.length; i++) { if ("1".equals(matrix[i])) { StringBuilder sb = new StringBuilder(); for (int m = i; m < matrix.length; m++) { // 先加后半部分 sb.append(matrix[m]); } for (int n = 0; n < i; n++) { // 再加前半部分 sb.append(matrix[n]); } max = Math.max(max, Integer.parseInt(sb.toString(), 2)); // 字符串转化为相对应的数字 } } return max; } }