最大子阵

给定一个 n×mn \times mn×m 的矩阵 AAA,求 AAA 中的一个非空子矩阵,使这个子矩阵中的元素和最大。其中,AAA 的子矩阵指在 AAA 中行和列均连续的一部分。

输入格式

输入的第一行包含两个整数 n,m(1≤n,m≤50)n,m(1 \leq n,m \leq 50)n,m(1n,m50),分别表示矩阵 AAA 的行数和列数。

接下来 nnn 行,每行 mmm 个整数,表示矩阵 Ai,j(−1000≤Ai,j≤1000)A_{i,j}(-1000 \leq A_{i,j} \leq 1000)Ai,j(1000Ai,j1000)。

输出格式

输出一行,包含一个整数,表示 AAA 中最大子矩阵的元素和。

样例输入

3 3
2 -4 1
-1 2 1
4 -2 2

样例输出

6
package 计蒜客;

import java.util.Scanner;

public class 最大子阵 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scan=new Scanner(System.in);
        int n=scan.nextInt();
        int m=scan.nextInt();
        int[][] arr=new int[n][m];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                arr[i][j]=scan.nextInt();
            }
        }
        int max=arr[0][0];
        for(int begini=0;begini<n;begini++){
            for(int endi=begini;endi<n;endi++){
                for(int beginj=0;beginj<m;beginj++){
                    for(int endj=beginj;endj<m;endj++){
                        int sum=0;
                        for(int i=begini;i<=endi;i++){
                            for(int j=beginj;j<=endj;j++){
                                sum+=arr[i][j];
                            }
                        }
                        if(sum>max&&sum!=0){//表明此子矩阵比max大,并且进入循环
                            max=sum;
                        }
                    }
                }
            }
        }
        System.out.println(max);
        
//        max=fun(arr,0,0,0,0);
//        System.out.println(max);
    }
    //递归调用  递归会超时,慎用
//    public static int fun(int[][] arr,int begini,int endi,int beginj,int endj){
//        if(endi==arr.length-1||endj==arr[0].length-1){
//            int sum=0;
//            for(int i=begini;i<=endi;i++){
//                for(int j=beginj;j<=endj;j++){
//                    sum+=arr[i][j];
//                }
//            }
//            return sum;
//        }
//        if(begini>endi||beginj>endj){
//            return 0;
//        }
//        return Math.max(Math.max(fun(arr,begini+1,endi,beginj,endj), fun(arr,begini,endi+1,beginj,endj)), Math.max(fun(arr,begini,endi,beginj+1,endj), fun(arr,begini,endi+1,beginj,endj+1)));
//    }
}

 

posted @ 2018-03-11 11:16  henu小白  阅读(242)  评论(0编辑  收藏  举报