标签:
一、设计思路:与求一维数组的最大子数组类似,将二维数组转化为一维数组来计算,也是通过遍历的方式将一个子矩阵与上几个子矩阵相加如果小于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语言,避免出现语法上的错误。
六、结组成员:杜永超、郭昊
标签:
原文地址:http://www.cnblogs.com/act-gh95/p/4412388.html