zoukankan      html  css  js  c++  java
  • 求一个二维数组的最大子矩阵的和(令矩阵的行首尾相接为环)

    要求:

    • 输入一个二维整形数组,数组里有正数也有负数。

    • 二维数组首尾相接,象个一条首尾相接带子一样。

    • 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    • 求所有子数组的和的最大值。

    设计思路:实现方式与<求一个二维数组的最大子矩阵的和>相似,依旧是“最笨方法”。更改计算行数的循环,使之到达最后一行后返回到第一行。

    源代码如下:

     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("总矩阵为:" + "
    ");
    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("
    ");
    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("
    " + "最大子矩阵的和为:" + sum);
    81         System.out.println("
    " + "最大子矩阵的起点为:" + (source_row+1) + "行" + (source_col+1) + "列" + "
    " 
    82                 +"边界为:" + ((edge_row%row)+1) + "行" + (edge_col+1) + "列");
    83         
    84     }

    运行结果:

    个人总结: 为程序添加功能时,以最小的代价添加。

  • 相关阅读:
    拍照上传图片方向调整
    js 压缩上传图片
    js 各种循环语法
    本地Git仓库对照多个远程仓库
    nrm安装与配置使用
    面试常见问题
    NodeJs文件路径
    vscode添加智能提示(typings)
    前端常用的工具库
    DeepMask学习笔记
  • 原文地址:https://www.cnblogs.com/jj352095583/p/4436947.html
Copyright © 2011-2022 走看看