zoukankan      html  css  js  c++  java
  • 二维表的中的最大子表求和

      这此实验的设计思路:暂时用的是最笨的方法,首先确定初始点(左上角的元素)之后确定末尾点(右下角的元素),之后运用简单的遍历进行加和,然后与暂时的最大子二维表的和进行比较,保留最大的,以此类推。(初始设计思路是:(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;
            }
    }

    在这个实验中所遇到的问题已经在前面表明,由于本人尚未查阅此实验的已经成功代码,所以本人还会针对前面遇到的问题进行思考,如果实在找不出解决办法,会参考网上的有关问题的解决办法。

  • 相关阅读:
    (转)轻松应对IDC机房带宽突然暴涨问题
    (转)老男孩:Linux企业运维人员最常用150个命令汇总
    (转)cut命令详解
    (转)Awk使用案例总结(运维必会)
    (转)Nmap命令的29个实用范例
    BigPipe学习研究
    js正则大扫除
    ffff表单提交的那点事
    高并发订单操作处理方法
    订单号的处理
  • 原文地址:https://www.cnblogs.com/hwh000/p/10589368.html
Copyright © 2011-2022 走看看