最大联通子数组求和

设计题目:求一个二维数组的连通的数组中和最大的最大值。

设计思路:

先建立二维数组并遍历二维数组,将所有的正整数进行分块,然后验证是否联通,如果不联通,则判断路径。

代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

package demo;

import java.util.*;

public class Lmax {

    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("\n");

        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;

    }

}

  截图:

总结:这次实验是我和张家星同学一块努力完成的,其间在弄实现的算法时较为麻烦,但在我们共同努力下通过上几次实验基础还完成了这次实验,对复杂的问题进行简单化,逐步完成。

时间: 2024-10-10 07:43:30

最大联通子数组求和的相关文章

返回一个二维数组中最大联通子数组的和

1 #include <iostream> 2 #include <time.h> 3 #include<string> 4 #include<fstream> 5 #define M 3 6 #define N 4 7 using namespace std; 8 9 int main() 10 { 11 int length[100],num[M][N] = {0},visit[M][N]={0},i=0;//length[100],是把文件中的数组转化

联通子数组最大值设计03

So郁闷,我先把老师提出的问题写出来; 返回一个二维整数数组中最大联通子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值.下面是给的示例图: 最近已经完全的陷入了编程的怪圈,自己完全没找到自己的方向吧,废话不多说,直接上问题:在子数组问题上我觉得基本都是一位子数组的变形,应该不会有特别的变化,最多是难度上去,但是基本的思想不会变,今天我发现错了,可能是我错了. 我的想法:在网上看代码找到的灵感:因为觉得老师上课讲的图的方法有些麻烦所以就想还是用一维数组的

lintcode循环数组之连续子数组求和

v 题目:连续子数组求和 II 给定一个整数循环数组(头尾相接),请找出一个连续的子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.如果多个答案,请返回其中任意一个. v 样例 给定 [3, 1, -100, -3, 4], 返回 [4,0]. v 思路 1.如果不是循环数组,求解连续子区间和的思路如下: 首先设一个累加变量和sum和最大值变量maxN,[ld, rd]表示当前正在累加的区间,[lt,rt]表示最大和的区间.从左边开始一直累加,并初始当前区间[ld

返回一个二维数组最大联通子数组的和

一.题目 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 二.设计思想 方法一:首先若要对二维数组进行分析,之前我们已经做过关于一位数组的练习,所以我们可以把它化简成为一个一维数组.再先求每个一维数组的最大子数组和,并记下每行最大一维子数组的下标.这是就会分两种情况:第一种是行之间的最大子数组是相连的,这时就可以直接相加得到:第二种是不相连的,,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后得到的结果就是最大联通子数组的和

返回一个二维整数数组中最大联通子数组的和6

1 问题:返回一个二维整数数组中最大联通子数组的和 2 思路:对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使每个最大数组块进行相连,求使其相连的最小代价.最后就可求出最大联通子数组的和. 3 代码 #include<ios

返回一个二维整数数组的最大联通子数组的和

题目:返回一个二维整数数组中最大联通子数组的和. 要求:输入一个二维整形数组,数组里有正数也有负数.求所有子数组的和的最大值. 一.设计思想 先求出这个这个数组中的最大值,并定位,然后找出这个值周围的4个数,联通这4个数中的正数,若全为负数,则查找次大值,并与最大值联通,判断联通前与联通后值得大小,若变小则不联通最大值,若变大则联通最大值,以此类推,直到最大联通子数组怎么联通都比原来的值小.

返回一个最大联通子数组的和

#include<iostream> #include<ctime> using namespace std; #define N 100 typedef struct { int dian[N]; int xian[N][N]; int dianx, xianx; }A; void set(A &shu, int x, int y) { shu.dianx = x*y; srand((unsigned)time(NULL)); for (int i = 1; i <

数组问题(三)求二维整型数组最大联通子数组的和

相较于上次求最大子矩阵的和,这次明显更难了一些. 将问题分解并分析,可以想到 先求各行中的最大子数组,并记录下标,求完之后再将各行的最大子数组的下标进行比较可以得到两种情况 1.上一行的最大子数组下标范围和下一行的最大子数组下标范围有重合的部分. 2.上一行的最大子数组下标范围和下一行的最大子数组下标范围无重合的部分. 程序代码: #include<iostream> using namespace std; int calculate(int n,int a[],int &sm,in

最大联通子数组的和(二)

设计思路同最大联通子数组的和(一)http://www.cnblogs.com/brucekun/p/5356994.html 将(一)未完成的部分做了基本补充,但是还存在bug: ⑴每行最大子数组的和为负数时显示为0(具体算法见http://www.cnblogs.com/brucekun/p/5316601.html) ⑵返回每行最大子数组的起始和最后元素时有时会出错 源代码: 1 #include<iostream> 2 #include<ctime> 3 int max_(