个人作业3

   二维数组求最大子矩阵的和

简单分析 ; 二维数组 是一维数组的 扩充 

先遍历一维数组的 子数组 

在将 下一行与上一行相加 变成 n-1行 仍然是遍历一维数组 以此类推。但是时间复杂度比较大

代码

package main;
 
import java.util.Scanner;
 

public class SumOfSubMatrix {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
//        int arr[][]={{1,2,-3},{3,4,-5},{-5,-6,-7}};        
        Scanner sc= new Scanner(System.in);        
        while(sc.hasNext())
        {
            int n= sc.nextInt();
            int arr[][]=new int [n][n];
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<n;j++)
                {
                    arr[i][j]=sc.nextInt();
                }
            }            
            System.out.println(sumOfSubMatrix(arr,n));
        }
    }
 
    public static int sumOfSubMatrix(int a[][],int n)
    {
        int max=Integer.MIN_VALUE;        
        
        //res保存的是从 i 行 到第 j 行 所对应的矩阵上下值的和 
        for(int i=0;i<n;i++)
        {
            int res[]=new int[n];
            for(int j=i;j<n;j++)
            {                
                for(int k=0;k<n;k++)
                {
                    res[k]+=a[j][k];
                }
                int maxNum=sumOfSubArray(res);
                if(maxNum>max)
                    max=maxNum;
            }
        }
        return max;        
    }
    
    public static int sumOfSubArray(int arr[])
    {
        if(arr.length==0||arr==null)
            return 0;
        int max=Integer.MIN_VALUE;
        int cur=0;
        for(int i=0;i<arr.length;i++)
        {
            cur+=arr[i];
            max=Math.max(max, cur);
            cur=cur<0?0:cur;
        }
        return max;        
    }
}

 

posted @ 2019-03-26 20:23  fsdx  阅读(94)  评论(0编辑  收藏  举报