二维数组的最大子数组之和

一、设计思路:与求一维数组的最大子数组类似,将二维数组转化为一维数组来计算,也是通过遍历的方式将一个子矩阵与上几个子矩阵相加如果小于0则舍去这个子矩阵,按此方法计算从这个子矩阵以后的矩阵,求得遍历中最大值,即为最大子数组之和。

二、代码:

 

package soft_third_test;

 

public class test {

 

    static int maxSum(int p[][],int startLine,int endLine,int n){

        int ans=p[endLine][1]-p[startLine][1];

        int cmax=ans;

        for(int i=2;i<=n;i++){

            int ci=p[endLine][i]-p[startLine][i];

            cmax=Math.max(cmax+ci, ci);

            ans=Math.max(cmax, ans);

        }

        return ans;

    }

    static int[][] colSum(int arr[][]){

        int m=arr.length;

        int n=arr[0].length;

        int p[][]=new int[m+1][n+1];

        for(int i=1;i<=m;i++)

            for(int j=1;j<=n;j++)

                p[i][j]=p[i-1][j]+arr[i-1][j-1];

        return p;

    }

    static int maxArrSum(int arr[][]){

        int m=arr.length;

        int n=arr[0].length;

        if(m>n){

            arr=reverseArr(arr);

            int tmp=m;

            m=n;

            n=tmp;

        }

        int p[][]=colSum(arr);

        int tempMax=0;

         

        //h表示当前矩阵的行数,即为把对多少行当做一行看待

        for(int h=1;h<=m;h++)

            for(int i=1;i+h-1<=m;i++){

                int endLine=i+h-1;

                 

                //转换为长度为n的一位数著,复杂度为O(n)

                tempMax=Math.max(tempMax, maxSum(p,i,endLine,n));

            }

        return tempMax;

    }

    static int[][] reverseArr(int[][] arr) {

        // TODO Auto-generated method stub

        int m=arr.length;

        int n=arr[0].length;

        int newArr[][]=new int[n][m];

        for(int i=0;i<m;i++)

            for(int j=0;j<n;j++)

                newArr[j][i]=arr[i][j];

        return newArr;

    }

    public static void main(String[] args) {

        // TODO Auto-generated method stub  

         

        int arr[][]={{1,2,-51,-4,-50},{-8,-3,4,255,1},{3,8,104,1,3},{-4,-1,10,7,-6}};

        int ans=maxArrSum(arr);
System.out.println(ans); } }

三、结果截图

四、代码测试中的问题

  首先是由于对java语言不熟悉,与c语言混淆,如输入输出语句的语法问题。还有就是程序运行出错,经检查是循环语句中未能准确写出循环终止条件,导致程序无限循环,不能正常使用。

五、总结

  这次的开发让我了解到的算法之间的共通性,可以举一反三,拓展思路。如由一维数组向二维数组拓展,但算法的思路仍然相同。还有就是要熟练的掌握java语言,避免出现语法上的错误。

六、结组成员:杜永超、郭昊

 

posted @ 2015-04-09 22:03  act_gh95  阅读(320)  评论(0编辑  收藏  举报