• 二维数组环求最大子数组


    1.实验要求

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

      二维数组首尾相接,象个一条首尾相接带子一样。

      数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 

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

    2.实验思路

      先随机产生一个二维数组;

      二维数组的第一列移动到最后一列,求最大的子数组和;

      二维数组的第一列移动到最后一列,求最大的子数组和;

      二维数组的第一列移动到最后一列,求最大的子数组和;

      ······

      直到循环完毕。

    3. 完整代码

    import java.util.Random;
    import java.util.Scanner;
    
    
    public class twoarray2 {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
             int a[][];
                int i,ii,j,jj,l,h,n,nn,k,kk,sum,max=0;
                ///随机产生一个数组
                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("");
                }
                 
                for(nn=0;nn<h;nn++)
                {
                    for(ii=0;ii<l;ii++)//l行的第一个数放到最好
                    {
                        kk=a[ii][0];
                        for(jj=0;jj<h-1;jj++)//每一行的第一个数放到最好
                        {
                            a[ii][jj]=a[ii][jj+1];
                        }
                        a[ii][jj]=kk;
                    }
                    System.out.println("将数组的第一列放到最后一列: ");
                    for(i=0;i<l;i++)/////////aaa输出动后的数组
                    {
                        for(j=0;j<h;j++)
                        {
                            System.out.print(a[i][j]);
                            System.out.print(" ");
                        }
                        System.out.println("");
                    }////////////////////////aaa输出动后的数组
                    //max=0;
                    for(n=0;n<l;n++)
                    {
                        sum=0;
                        for(i=0;i<l-n;i++)
                        {
                            sum=0;
                            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("目前求得的最大和的子数组的和为: ");
                    System.out.println(max);
                }
    
    
        }
    
    }

    4. 截图

    5. 总结

       我们采用了最基本的方法,不过我们运用了多次验证结果的方法,使截图运行更加可靠。

  • 相关阅读:
    Linux帮助都有哪几种,如何使用?
    描述linux目录结构以及目录结构命名规定
    常见Linux的发行版有哪些?并描述不同发行版之间的联系与区别。
    【redis常用的键值操作及性能优化】
    【防护墙学习-1】
    【生成树中易混淆的概念及拓扑集】
    【linux运维递进】
    【windows中常用的服务概览和总结】
    【shell脚本学习-4】
    【shell脚本学习-3】
  • 原文地址:https://www.cnblogs.com/zchenjian/p/4452412.html
Copyright © 2020-2023  润新知