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


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

  • 相关阅读:
    队列课下作业
    20162305 2017-2018-1 《程序设计与数据结构》第6周学习总结
    20162305 2017-2018-1 《程序设计与数据结构》第5周学习总结
    线性结构 实验报告 20162305
    算法复杂度-实验博客
    2017-2018-1 《程序设计与数据结构》第3周学习总结
    20162305 2017-2018-1 《程序设计与数据结构》第2周学习总结
    20162316刘诚昊 课下排序测试
    20162316刘诚昊 17年10月9日测验“排序课堂测试”
    20162316刘诚昊 第五周学习总结
  • 原文地址:https://www.cnblogs.com/bailanglang/p/6696197.html
Copyright © 2020-2023  润新知