二维数组子数组最大和

1.结组成员

  周盼超、张晨建

2.实现功能  

  随机产生一个二维整形数组,数组里有正数也有负数。

  二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和。

  求所有子数组的和的最大值。

3.设计思路

  我感觉,这应该是最笨的方法了吧,我们用了用了四个for嵌套。思路很简单:每一行每一行的求最大子数组和即看成n个一维子数组求最大子数组和,记录结果,然后把两行看做一行上下两个数相加,每两行两行求最大子数组和,然后三行,四行,n行。

4.完整代码  

package 二维数组;

import java.util.Random;
import java.util.Scanner;

public class b {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a[][];
        int i,j,l,h,n,k,sum,max;
        ///随机产生一个数组
        Scanner scanner = new Scanner(System.in);
        System.out.print("输出随机产生的数组的长度:");
        h=scanner.nextInt();
        System.out.print("输出随机产生的数组的高度:");
        l=scanner.nextInt();
        scanner.close();
        a=new int[l][h];

        for(i=0;i<l;i++)
        {
            for(j=0;j<h;j++)
            {
                Random random = new Random();
                a[i][j]=random.nextInt(19);
                a[i][j]=a[i][j]-9;
                System.out.print(a[i][j]);
                System.out.print(" ");
            }
            System.out.println("");
        }

        max=0;
        for(n=0;n<l;n++)
        {
            sum=0;
            for(i=0;i<l-n;i++)
            {
                for(j=0;j<h;j++)
                {
                    for(k=i;k<=i+n;k++)
                    {
                        sum=sum+a[k][j];
                    }
                    //System.out.print(sum);
                    //System.out.print(" ");
                    if(sum<0)
                    {
                        sum=0;
                    }
                    if(max<sum)
                    {
                        max=sum;
                    }
                }
            }
        }
        System.out.print(max);
        System.out.println("");
    }
}

5.运行结果截图

6.我的收获

  此次实验,我们经过了思考、讨论、编程、测试。现在感觉思考阶段是最为要紧的,我们没有想出什么更好的办法,就用四个for这种笨法简单的实现了。但这次实验也有不小的收获,就是对for的使用更加熟悉了,四个for嵌套也是小菜一碟。

时间: 2024-08-28 07:42:50

二维数组子数组最大和的相关文章

二维数组子数组的最大值之和

题目:求一个二维数组中其子数组之和的最大值. 人员: 陈晨:负责程序编写. 王颖瑞:负责代码复审和代码测试. 思路:对于求二维数组的子数组之和,思路和求一维数组的相差不多,但需要分析更多的情况,我跟舍友讨论之后,之后写的.以下是我的思路: 1.确定子数组的最大上界,从第一行依次向下,规定最大子数组的范围. 2.对于规定好的最大子数组的范围,把最大子数组按照一列有几个数,分成几种不同的行.(如第一组只有一行,第二组有两行等,列数和数组的列数相同) 3.对于第二步产生的几个数组,进行一维数组求子数组

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

分析 1,开始先将将二维矩阵转换成图的存储形式,当两个相邻的数之间是联通的时,记长度为1,否则就是0: 2,将整个图从每个点都开始遍历一遍,遍历过程中时,当和小于0时断开两点间的路,当和大于最大和时改变最大和的值: 3,取以每个点为起点遍历的和的最大值即时最大联通子数组的和.遍历时,选取已遍历的联通子数组周围最大值遍历.经过重复的几次遍历就可以确定此数组中最大连通数组和了. 题目要求: 放在一个input.txt的文件中 数组里面有正数有负数 返回联通子数组和最大的值 #include<fstr

一维数组子数组最大和

题目:返回一个一维整数数组中最大子数组的和. 要求: 输入一个一维整形数组,数组里有正数也有负数. 一维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 设计思想: 生成数组,生成子数组,求和,求最大值. 代码: package bao; import java.util.*; public class Msum { public static void main(String args[]) { Scanne

用二维数组存一组学生的成绩,输出总成绩的是谁和分数,输出语文第一名是的谁和成绩

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> //一组学生的成绩,输出总成绩的是谁和分数,输出语文第一名是的谁和成绩 var score = [ { name: '小明', chinese: 128, math: 127, engl

环状连续数组,求子数组最大和

今天看到环状连续数组求子数组最大和的题目,看了几篇博客,但是好像有问题,可以举出反例.于是参考其他人的博客自己又总结下. 首先,求非环状的数组中子数组 最大和问题是一个动态规划的思想. sum[i] = max(sum(i-1) + a[i], a[i]); sum[i]代表以i元素结尾的子数组的最大和,sum[i-1]代表以i-1元素结尾的子数组的最大和,a[i]代表第i个元素的值,由此公式可得,以第i个元素结尾的子数组的最大和可以由它之前的以第i-1个元素结尾的子数组的最大和推导出.如果以i

二维数组成环最大和的子数组的和

设计思想:综合了前面一维数组成环和二维数组求最大子数组的思想. 屏幕截图: : 总结: 把做过的程序封装成一个个的接口,当使用时直接调用即可. 源代码: //jiangzhongxi 2015/4/16#include<iostream>using namespace std;void max(int row,int col){ int ** a=new int*[row+1];    int ** b=new int*[row+1];    int h;//用于每一个一维数组上已经相加元素的

Task 4.5 求二维数组中的最大连通子数组之和

任务:输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值.要求时间复杂度为O(n). 1.设计思想:因为用之前的解决子数组最大和的问题的思路一直没能解决这个问题,后来看到同学使用将矩阵转化为图的思路将结果得出了,所以我就沿着这个思路一步一步的分析了一下.开始先将将二维矩阵转换成图的存储形式,当两个相邻的数之间是联通的时,记长度为1,否则就是0:将整个图从每个点都开始遍历一遍,遍历过程中时,当和小于0时断开两点间的路,当和大于最大和时改变最大和的值,取以每个点为起点遍历的和的最

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

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

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

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],是把文件中的数组转化