zoukankan      html  css  js  c++  java
  • 返回一个首尾相接的二维整数数组中最大子数组的和

    题目:

    ·返回一个二维整数数组中最大子数组的和。

    要求:

    ·输入一个二维整形数组,数组里有正数也有负数。

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

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

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

    源代码:

    import java.util.Random;

    import java.util.Scanner;

    public class erweixunhuanzishuzu {

    public static void main(String[] args) {

    //产生随机数组

    int array[][] = new int[1000][1000];

    int arraytemp[] = new int [1000];

    int row,col,sum,sumTemp;

    int t,m;

    int qx=0,qy=0;

    int zx=0,zy=0;//分别记录子数列的起始和结束位置

    for(int i=0;i<1000;i++)

    arraytemp[i]=0;

    System.out.print("请分别输入数组的行数和列数:");

    Scanner sc=new Scanner(System.in);

    row = sc.nextInt();

    col = sc.nextInt();

    Random r = new Random();

    System.out.println("产生的随机数序列为:     ");

    for(int i=0;i<row;i++){

    for(int j=0;j<col;j++){

    array[i][j]=r.nextInt()%10;

    array[i][j+col]=array[i][j];

    }

    }

    for(int i=0;i<row;i++){

    for(int j=0;j<col;j++){

    System.out.print(array[i][j]+"   ");

    if(j == col-1)

    System.out.println("");

    }

    }

    //求最大子数组

    sum=array[0][0];

    sumTemp=sum;

    for(int i=0;i<row;i++){

    for(int x=0;x<1000;x++)

    arraytemp[x]=0;

    for(t=i;t>=0;t--){

        for(int s=0;s<2*col;s++){

        if(t>=0){

        arraytemp[s]+=array[t][s];

        //qx=t;

        //qy=s;

        //System.out.println("&"+qx+" "+qy);

        //System.out.println("%"+arraytemp[s]+"%");

        }

        }

        sumTemp=arraytemp[0];

        m=0;

    for(int j=0;j<2*col;j++){//按列消元

    if(sumTemp<=0){

    sumTemp=0;

    m=j+1;

    //qx=t;

    //qy=j;

    //System.out.println("&1 "+qx+" "+qy);

    }

    //System.out.println("#"+sumTemp+"#");

    //System.out.println("*"+arraytemp[j+1]+"*");

    if(j+1<qy+col){

    sumTemp+=arraytemp[j+1];

    if(sumTemp>sum){

    sum=sumTemp;

    qx=t;

    qy=m;

    zx=i;

    zy=j+1;

        //System.out.println("@"+qx+" "+qy);

        //System.out.println("%"+zx+" "+zy);

    }

    }

    /*else

    break;*/

    }   

    }

    }

    System.out.println("最大子数组的和为:"+sum);

    System.out.println("子数组为:");

    for(int i=qx;i<=zx;i++)

    for(int j=qy;j<=zy;j++){

    System.out.print(array[i][j]+" ");

    if(j==zy)

    System.out.println("");

    }

    }

    }

    结果截图:

    编程总结:

          每次编程并不是重新开始,以前编过的程序都是,后面程序的基础,注意保存以前的成果,编程后梳理编程思路,形成一定的套路和模板会对今后的编程有很大帮助。勇于承认自己的不足,并积极追赶,虚荣心是自己给自己设定的敌人,而不是别人设定的。综上所述,要多和别人交流,产生思维的碰撞,固步自封是愚蠢的做法。

  • 相关阅读:
    基于visual Studio2013解决算法导论之018栈实现(基于链表)
    基于visual Studio2013解决算法导论之017查找第n小元素
    基于visual Studio2013解决算法导论之016查找最大值最小值
    基于visual Studio2013解决算法导论之015第二小元素
    基于visual Studio2013解决算法导论之013基数排序
    shell脚本执行的三种方式
    Linux rm删除大批量文件遇到 Argument list too long
    lsof 命令简介
    查看目录大小以及目录数量的命令
    python调用脚本或shell的方式
  • 原文地址:https://www.cnblogs.com/bdqczhl/p/4445457.html
Copyright © 2011-2022 走看看