这个题目是二维的,是在一维数组的基础上的一次扩展
在一维数组中求连续区间的最大值是很容易的,但是二维数组中就就比较麻烦
所以可以将二维数组的求法转变成一维数组
转变的方法就是对每一列求一个前缀和
然后划定上下边界,在上下边界中的每一列的x个数,可以利用之前求好的前缀和数组进行求解,就是标准的一维数组的做法了
同时ma的初始值一开始设定了0,但是出现了wa,原因是因为数组中存在负数,所以ma的初始值也应该是一个较小的负数
import java.util.Scanner;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner= new Scanner(System.in);
int n=scanner.nextInt();
int a[][]=new int [n+1][n+1];
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]=scanner.nextInt();
a[i][j]+=a[i-1][j];
}
}
int ma=Integer.MIN_VALUE;
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
//两个上下边界
int last=0;
//每确定好一次上下边界后,相当于了一个一维数组,令last的初始值为0
//取消了数组,因为每一次求下次取值的时候只会应用到了上一次的结果
for(int k=1;k<=n;k++){//列
last=Math.max(0, last)+a[j][k]-a[i-1][k];
ma=Math.max(ma, last);
}
}
}
System.out.println(ma);
}
}