package shuzuhe;
import java.util.Random;import java.util.Scanner;public class he4 { public static void main(String[] args) { 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(11); a[i][j]=a[i][j]-1; 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++) { 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(max); System.out.println(""); }}
网上看了很多可以解决这个问题的代码,有枚举什么的看不太懂,只有这个代码理解了。接下来说说我的理解。
该代码的核心是
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; } } } }其他的为随机产生一个二维数组。
以实验数据为例解释一下
运行结果:
输出随机产生的数组的长度:3输出随机产生的数组的高度:3-1 4 -1 0 4 8 5 6 0 -1 4 3 0 4 12 5 11 11 -1 8 15 5 15 23 4 18 25 25首先它的结果的产生是先由一行一行的数字算,例如第一行就是a(1,1),a(1,1)+a(1,2),a(1,1)+a(1,2)+a(1,3),然后2*2的小数字块,最后是3*3的。
首先给max赋值为0,然后max+-1=-1,然后sum值为-1,运行下列if语句
if(sum<0)
{ sum=0; }使sum值为0,然后sum+4=4,运行下列if语句
if(max<sum)
{ max=sum; }最后产生的max即为最大值
但是它的循环部分还是有些不太明白,虽然可以通过结果可以推测出是怎么循环的。