要求:
• 输入一个二维整形数组,数组里有正数也有负数。
• 二维数组首尾相接,象个一条首尾相接带子一样。
• 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
• 求所有子数组的和的最大值。
设计思路:实现方式与<求一个二维数组的最大子矩阵的和>相似,依旧是“最笨方法”。更改计算行数的循环,使之到达最后一行后返回到第一行。
源代码如下:
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 }
运行结果:
个人总结: 为程序添加功能时,以最小的代价添加。