本题目类似于柱状图中最大矩形,不过那一题使用单调栈做的(只有0和1),本题的话也可以用类似的思路,遍历矩形的行的起点和终点组合,然后相当于就是求解最大连续子数组和,最后取全局最大。
import java.util.*;
public class Main{
    public static void main(String []args){
        Scanner input=new Scanner(System.in);
        int n=input.nextInt();
        int [][]num=new int[n][n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                num[i][j]=input.nextInt();
            }
        }
       
        int max=Integer.MIN_VALUE;
        for(int i=0;i<n;i++){
             int []tmp=new int[n];
            for(int k=i;k<n;k++){
                for(int j=0;j<n;j++){
                    tmp[j]+=num[k][j];
                }
                max=Math.max(max,new Main().getMax(tmp));
            }
            
        }
        System.out.println(max);
        
  
    }
    public int getMax(int[]arr){
        int n=arr.length;
        if(n==0){
            return arr[0];
        }
        int max=arr[0];
        int []dp=new int[n];
        dp[0]=arr[0];
        for(int i=1;i<n;i++){
            dp[i]=Math.max(dp[i-1]+arr[i],arr[i]);
            max=Math.max(max,dp[i]);
        }
        return max;

    }
}