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

1.设计思想:先用户键盘输入一个自定义的几行几列的矩阵,然后输入相关的值,再调用求二维数组最大联通子数组和的方法,最终输出最大值。

2.出现问题:对于求联通子数组的这个思路不是很懂,不清楚。

3.解决方案:先求每行的最大和最小块,再求总的最大值,再将其输出;当列数为1时,当成一维计算;

4.源代码:

/*返回一个整数数组中最大子数组的和。
输入一个一维整形数组,数组里有正数也有负数。
一维数组首尾相接,象个一条首尾相接带子一样。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。*/
package shuzumax;
import java.util.Scanner;
public class shuzuu
{
    public static void main(String[] args)
    {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入二维数组的行和列:");
        int hang=scanner.nextInt();
        int lie=scanner.nextInt();
        int[][] shuzu=new int[hang][lie];
        int i,j;
        for(i=0;i<hang;i++)
        {
            for(j=0;j<lie;j++)
            {
                shuzu[i][j]=scanner.nextInt();
            }
        }
        System.out.println("此数组中连续和的最大值为:"+max(shuzu,hang,lie));
    }
    static int max(int shuzu[][],int hang,int lie)
    {
        int max=0,sum=0;
        int i,j;
        int[] b=new int[lie];
        int[] up=new int[hang];
        int[] down=new int[hang];
        int[] t=new int[hang];
        if(lie==1)
        {
            for (i=0;i<hang;i++)
            {
                sum+=shuzu[i][0];
                if(sum<0)
                {
                    sum=0;
                }
                if(sum>max)
                {
                    max=sum;
                }
            }

           if(max==0)
           {
               for(i=0;i<hang;i++)
               {
                   if(i==0)
                   {
                       max=shuzu[i][0];
                   }
                   if(shuzu[i][0]>max)
                   {
                       max=shuzu[i][0];
                   }
               }
            }
        }
        else
        {
            for(i=0;i<hang;i++)
            {
                for(j=0;j<lie;j++)
                {
                    b[j]=shuzu[i][j];
                }
                int[] c=new int[100];
                c[0]=0;
                int sum1=0,max1=0,k;
                for(k=0;k<lie;k++)
                {
                    if(sum1<0)
                    {
                        sum1=b[k];
                    }
                    else
                    {
                        sum1=sum1+b[k];
                    }
                    c[k]=sum1;
                }
                max1=c[0];
                int mmark=0,smark=0;
                for(k=0;k<lie;k++)
                {
                    if (max1<c[k])
                    {
                        max1= c[k];
                        mmark = k;
                    }
                }
                for (k = mmark;k >= 0;k--)
                {
                    if (c[k] == b[k])
                    {
                        smark = k;
                        break;
                    }
                }
                sum=max1;

                up[i]=smark;
                down[i]=mmark;
                t[i]=sum;

            }
            int t2=t[0];
            for(i=0;i<hang-1;i++)
            {
                if(up[i]<=down[i+1] && down[i]>=up[i+1])
                {
                    t2+=t[i+1];
                }
                for(j=up[i];j<up[i+1];j++)
                {
                    if(shuzu[i+1][j]>0) t2+=shuzu[i+1][j];                   //判别独立正数
                }

            }
            max=t2;
        }
        return max;
    }
}

5.截图:

6.总结:通过这次的实验,我觉得我对二维数组理解的还不够深入,对于问题要一层层的剖析,将问题简单化,才能进步。

时间: 2024-12-29 07:54:08

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

浅谈二维中的树状数组与线段树

一般来说,树状数组可以实现的东西线段树均可胜任,实际应用中也是如此.但是在二维中,线段树的操作变得太过复杂,更新子矩阵时第一维的lazy标记更是麻烦到不行. 但是树状数组在某些询问中又无法胜任,如最值等不符合区间减法的询问.此时就需要根据线段树与树状数组的优缺点来选择了. 做一下基本操作的对比,如下图. 因为线段树为自上向下更新,从而可以使用lazy标记使得矩阵的更新变的高校起来,几个不足就是代码长,代码长和代码长. 对于将将矩阵内元素变为某个值,因为树状数组自下向上更新,且要满足区间加法等限制

JS:二维数组排序和获取子级元素

JS:二维数组排序和获取子级元素 1. 二维数组排序 1.按数值排序 1 var arr = [[1, 2, 3], [7, 2, 3], [3, 2, 3]]; 如果我们要按每个子数组的第一列来排序要如何做呢,我们可以定义一个比较函数: 1 arr.sort(function(x, y){ 2 return x[0] – y[0]; 3 }); 这里的比较函数的作用是什么呢?其实是数组依次将数组元素复制给x,y,比如首先将arr[0]赋给x,arr[1]赋给y,然后用x[0] – y[0],根

二维数组的最大联通子数组和

设计题目:求一个二维数组的连通的数组中和最大的最大值. 设计思路: 建立二维数组并遍历二维数组,将所有正整数分块,验证是否联通,如果不联通,判断路径. 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 =

二维数组中的最大联通子数组

题目: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值. 思路: 总结:

二维数组最大连通子数组

设计思想: 主要用数据结构中遍历的思想,按照一定次序访问,不通则回溯.改程序已经做成界面版,在消灭星星中运用. 源代码 : package star; import java.awt.Component;import java.awt.Container;import java.awt.GridLayout;import java.awt.Image;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;im

最大联通子数组

1.题目:返回一个二维整数数组中最大联通子数组的和. 要求: 输入一个二维整形数组,数组里有正数也有负数. 求所有子数组的和的最大值.要求时间复杂度为O(n). 2.设计思路 对n*m的二维数组进行分解,分解为n个一维数组,再先求这n个一维数组的最大子数组和,并记下每行最大一维子数组的下标如2-5,这是就会分两种情况第一种是行之间的最大子数组是相连的,如第一行是2-5,第二行是3-6,这是直接相加就行.第二种是不相连的如第一行是2-5,第二行是6-7,这时候就把每行的最大子数组看成一个整体,再使

结对开发之最联通子数组

一.题目要求 输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和 二.解题思路 先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果. 三.程序代码 2 #include<iostream.h> 3 int main(int argc, char* argv[]

二维数据和一维指针数组

1.二维数组名a的含义: 定义一个二维数组a : int a[3][4] = {{1,3,5,7}, {9,11,13,15}, {17,19,21,23}}; a数组包含3个行元素,a[0],a[1],a[2]. 每个行元素a[i] 又是一个一维数组,它包含4个元素. a == &a[0] a + i == &a[i] a[0] == &a[0][0] a[i] == &a[ i ][0] 2.二维数组地址的关系:(地址由行至列以元素类型递增) 3.二维数组与一维指针数组

结对作业---最大联通子数组