zoukankan      html  css  js  c++  java
  • 最大二维连通数组的和

      结对小组成员:康治家,张生辉

    设计思路:首先若要对二维数组进行分析,通常想要把它化简成为一个一维数组。再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标。这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到;第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价。最后得到的就是最大联通子数组的和

    package 二维数组;
    import java.util.*;
    public class Tarray {
        static Scanner scanner = new Scanner(System.in);
        public static void main(String args[]){
            int m,n;
            int b;
            Scanner scanner = new Scanner(System.in);
            
            System.out.println("二维数组的列数:");
            m = scanner.nextInt();
            System.out.println("二维数组的行数:");
            n = scanner.nextInt();
            int arr[][] = new int[n][m];
             System.out.println("请输入二位数组:");
            for(int i = 0;i<n;i++)
            for(int j=0;j<m;j++)
            {
                arr[i][j] = scanner.nextInt();
            }
            System.out.println("
    ");
            b = maxArrSum(arr);
            System.out.println("最大联通数组的最大和为"+b);
        }
        
    
        public static int[][] arrSum(int arr[][]){
            int m = arr.length;
            int n = arr[0].length;
            int p[][] = new int[m+1][n+1];
            p[0][0] = arr[0][0];
            for(int i=0; i<=m; i++) p[i][0] = 0;
            for(int i=0; i<=n; i++) p[0][i] = 0;
            for(int i=1; i<=m; i++){
                for(int j=1; j<=n; j++){
                    p[i][j] = p[i-1][j] + p[i][j-1] + arr[i-1][j-1] - p[i-1][j-1];
                }
            }
            return p;
        }
    
        //遍历所有二维数组的矩形区域
        
        static int  maxArrSum(int arr[][]){
            int m = arr.length;
            int n = arr[0].length;
            int p[][] = arrSum(arr);
            int ans = Integer.MIN_VALUE;
            for(int i=1; i<=m; i++){
                for(int j=1; j<=n; j++){
                    for(int endi=i; endi <=m; endi++){
                    for(int endj=j; endj<=n; endj++){    
                            int sum = p[endi][endj] - p[i-1][endj] - p[endi][j-1] + p[i-1][j-1];
                            if(ans < sum) ans = sum;    
                        }
                    }    
                }    
            }    
            return ans;    
        }
        
        
    
    }

     截图:

    编译分析:在编写的过程中遇到的问题还是很多,我们在编写过程中通过查询网络资料解决了一些问题,总之这个问题需要分步来解决,我们解决的时候也是思考了非常的长的时间,继续努力的写吧,实力还是差些。

     图片:

  • 相关阅读:
    python-列表基本方法
    成员/身份运算
    python-字符串常用方法
    python基础知识1
    jmeter_性能测试及报告分析
    Day3_linux_工作目录切换命令
    Day2_linux_查看系统状态
    Day1_liunx_常用系统工作命令
    互联网是有记忆的
    第3章 Python基础
  • 原文地址:https://www.cnblogs.com/kangzhijia/p/6679109.html
Copyright © 2011-2022 走看看