要求:
• 输入一个二维整形数组,数组里有正数也有负数。
• 二维数组首尾相接,象个一条首尾相接带子一样。
• 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
• 求所有子数组的和的最大值。
设计思路:实现方式与<求一个二维数组的最大子矩阵的和>相似,依旧是“最笨方法”。更改计算行数的循环,使之到达最后一行后返回到第一行。
源代码如下:
1 /*
2 * row,col分别为数组行数和列数
3 * source_row,source_col为子矩阵的起始位置
4 * edge_row,edge_col分别为行列边界
5 * */
6 public static int row = 5,col = 5;
7 public static int source_row = -1,source_col = -1,edge_row = -1,edge_col = -1;
8
9 public static void main(String[] args){
10 int a[][] = new int[row][col];
11
12 // 随机赋值
13 System.out.println("总矩阵为:" + "\n");
14 for(int i = 0;i < row;i++){
15 for(int j = 0;j < col;j++){
16 a[i][j] = (int)(Math.random() * 20 - 10);
17 if(a[i][j] >= 0)
18 System.out.print(" ");
19 System.out.print(a[i][j] + " ");
20 }
21 System.out.print("\n");
22 }
23
24
25
26 /*
27 * 依次循环每行每列的每个数据项
28 * 寻找每个数据项能组成的子矩阵之和
29 * 更新赋值m和n分别为每次计算行列的边界
30 * 即每次计算a[i][j] 从i~m行,j~n列的子矩阵的和
31 * */
32 int sum = a[0][0],sum_temp = 0;
33 for(int i = 0;i < row;i++){
34 for(int j = 0;j < col;j++){
35 int m = i,n = j;
36 while(1 != 0){
37 while(n < col){
38 /*
39 * 当行数大于等于row,即需要循环时,返回第一行开始加
40 * 否则使用一般情况
41 * */
42 if(m >= row){
43 for(int k = i;k < row;k++){
44 for(int l = j;l <= n;l++){
45 sum_temp = sum_temp + a[k][l];
46 }
47 }
48 for(int k = 0;k <= (m % row);k++){
49 for(int l = i;l <= n;l++){
50 sum_temp = sum_temp + a[k][l];
51 }
52 }
53 }
54 else{
55 for(int k = i;k <= m;k++){
56 for(int l = j;l <= n;l++){
57 sum_temp = sum_temp + a[k][l];
58 }
59 }
60 }
61 if(sum_temp > sum){
62 sum = sum_temp;
63 source_row = i;
64 source_col = j;
65 edge_row = m;
66 edge_col = n;
67 }
68
69 sum_temp = 0;
70 n++;
71 }
72 m++;
73 n = j; // 重置m边界
74 if(m % row == i)
75 break;
76 }
77 }
78 }
79
80 System.out.println("\n" + "最大子矩阵的和为:" + sum);
81 System.out.println("\n" + "最大子矩阵的起点为:" + (source_row+1) + "行" + (source_col+1) + "列" + "\n"
82 +"边界为:" + ((edge_row%row)+1) + "行" + (edge_col+1) + "列");
83
84 }
运行结果:

个人总结: 为程序添加功能时,以最小的代价添加。
来源:https://www.cnblogs.com/jj352095583/p/4436947.html