二维数组

package erweishuzu;

import java.util.Scanner;

public class erweishuzu {
     public static void main(String[] args) {
         
         int a_hang=0,z_hang=0,a_lie=0,z_lie=0;//记录初始点和末尾点的行和列
         /*
         int hang[] = new int [3];//存储每一行的总值
         int lie[] = new int [3];//存储每一列的总值
         int max[] = new int [3];//存储每个最大矩形
         int hangsum = 0 ;//记录每一行总值
         int liesum = 0;//记录每一列总值
         int sum=0 ;//记录二维数组的总值
         int nhang=0;//记录行的第序
         int nlie=0;//记录列的第序
         int jieti;//记录大阶梯二维表第序
         int dingwei;
         
         */
         Scanner input = new Scanner(System.in);
         /*
         max[0]=erwei[0][0];//记录左上角一个元素的二维表
         
         //计算对角线矩阵值 和 每一行的总值
         for(z_hang=0;z_hang<3;z_hang++) {
             for(z_lie=0;z_lie<3;z_lie++) {
                 hangsum=hangsum+erwei[z_hang][z_lie]; //记录每  行  的总值
                 sum=sum+erwei[z_hang][z_lie];
             }
             hang[nhang]=hangsum;//行总值存储于对应的数组
             hangsum=0;
             System.out.println(hang[nhang] + " 第" + (nhang+1) + "行");
             nhang++;
         }
         
         //记录整体矩阵的总值
         max[2]=sum;//全部数据的总值
         
         //计算每一列的总值
         for(z_lie=0;z_lie<3;z_lie++) {
             for(z_hang=0;z_hang<3;z_hang++) {
                 liesum=liesum+erwei[z_hang][z_lie]; //记录每  列  的总值
             }
             lie[nlie]=liesum;//列总值存储于对应的数组
             liesum=0;
             System.out.println(lie[nlie] + " 第" + (nlie+1) + "列");
             nlie++;
         }
         
         //计算每个阶梯矩形的总值
         for(jieti=2;jieti>1;jieti--) {
             max[(jieti-1)]=max[jieti]-hang[jieti]-lie[jieti]+erwei[jieti][jieti];
             System.out.println("第一矩阵:" + max[jieti] + "   第二矩阵:" + max[jieti-1] + "   第三矩阵:" + max[0]);
         }
         */
         int zhenshi_hang,zhenshi_lie,m,n;
         System.out.print("请输入二维表的行数: ");
         m=input.nextInt();
         System.out.print("请输入二维表的列数: ");
         n=input.nextInt();
         int erwei[][] = new int [m][n];
         for(zhenshi_hang=0;zhenshi_hang<m;zhenshi_hang++) {
             System.out.print("请输入第" + (zhenshi_hang+1) + "行的" + n + "个数:");
             for(zhenshi_lie=0;zhenshi_lie<n;zhenshi_lie++) {
                 erwei[zhenshi_hang][zhenshi_lie]=input.nextInt();
             }
         }
         System.out.println("    *");
         System.out.println("      输入完毕!!!");
         System.out.println("    *");
         System.out.println("    *");
         System.out.println("    *");
         System.out.println("    *");
         System.out.println("    *");
         
         int linshi_h,linshi_l,linshi_sum=0,linshi_max=0;
         
         //按顺序生成初始点
         for(a_hang=0;a_hang<m;a_hang++) {
             for(a_lie=0;a_lie<n;a_lie++) {
                 //按顺序生成末尾点
                 for(z_hang=a_hang;z_hang<m;z_hang++) {
                     for(z_lie=a_lie;z_lie<n;z_lie++) {
                         //计算两点之间的二维表总数
                         for(linshi_h=a_hang;linshi_h<=z_hang;linshi_h++) {
                             for(linshi_l=a_lie;linshi_l<=z_lie;linshi_l++) {
                                 linshi_sum=linshi_sum+erwei[linshi_h][linshi_l];
                             }
                         }
                         //实时更新最大的二维表
                         linshi_max=maxx(linshi_max,linshi_sum);
                         //将临时二维表总值归零
                         linshi_sum=0;
                     }
                 }
             }
         }
         System.out.println("最大子二维数组为:" + linshi_max);
     }
     
     
     //定义的计算最大数的函数
     static int maxx(int a , int b){
            int max;
            if(a<b) {
                max = b;
            }else {
                max = a;
            }
            return max;
        }
}

这此实验的设计思路:暂时用的是最笨的方法,首先确定初始点(左上角的元素)之后确定末尾点(右下角的元素),之后运用简单的遍历进行加和,然后与暂时的最大子二维表的和进行比较,保留最大的,以此类推。(初始设计思路是:(1)求出对角线及对角线之外的几个二维表的和,(2)然后在他们的基础上减去所求子二维表中不包含的行和列,(3)再加上重复减去的元素,进而求出最大的子二维表的和,但由于(2)环节没有好的实行思路和时间原因,所以这个原始的设计思路被暂且搁置了)

运行截图:

原文地址:https://www.cnblogs.com/jinseliunian/p/11054977.html