这此实验的设计思路:暂时用的是最笨的方法,首先确定初始点(左上角的元素)之后确定末尾点(右下角的元素),之后运用简单的遍历进行加和,然后与暂时的最大子二维表的和进行比较,保留最大的,以此类推。(初始设计思路是:(1)求出对角线及对角线之外的几个二维表的和,(2)然后在他们的基础上减去所求子二维表中不包含的行和列,(3)再加上重复减去的元素,进而求出最大的子二维表的和,但由于(2)环节没有好的实行思路和时间原因,所以这个原始的设计思路被暂且搁置了)
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; } }
在这个实验中所遇到的问题已经在前面表明,由于本人尚未查阅此实验的已经成功代码,所以本人还会针对前面遇到的问题进行思考,如果实在找不出解决办法,会参考网上的有关问题的解决办法。
原文:https://www.cnblogs.com/hwh000/p/10589368.html