题目:求一个二维数组中的最大子数组的和
分析:以前做过一个一位数组的求和,现在改为二维数组,复杂了很多,但基本思想不变。经过几天的讨论,与程序的修改,实现了题目的要求。源代码如下:
package com.su.test;
public
class
Hellosu {
public
static
void
main(String[] args)
{
//测试用例
int
b[][]={{3,4,-7},{7,2,0},{-11,3,0}};
int
max=maxSubMatrix(b,b.length,b[0].length);
System.
out
.println(max);
}
public
static
int
maxSubArray(
int
ar[],
int
n)
//一维数组最大子数组
{
int
max=ar[0];
int
k[]=
new
int
[3];
int
b=ar[0];
int
i;
for
(i=1;i<n;i++)
{
if
(b>0)
{
b+=ar[i];
}
else
{
b=ar[i];
}
if
(b>max)
{
max=b;
}
}
return
max;
}
public
static
int
maxSubMatrix(
int
p[][],
int
m,
int
n)
//二维数组最大子矩阵
{
int
i,j,k,max=p[0][0],tempt;
//记录每行的和
int
last_i=0,last_j=0;
int
sum[]=
new
int
[m];
for
(i=0;i<n;i++)
{
for
(k=0;k<m;k++)
sum[k]=0;
for
(j=i;j<n;j++)
{
for
(k=0;k<m;k++)
{
sum[k]+=p[k][j];
}
tempt=maxSubArray(sum,m);
if
(tempt>max)
{
last_i=i;
last_j=j;
max=tempt;
}
}
}
System.
out
.println(
"从第"
+(last_i+1)+
"列开始,到第"
+(last_j+1)+
"结束"
);
return
max;
}
}
总结:结对开发是我们练习的重点,主要是形成一个习惯:能设计算法,并且具有可读性;能找出别人写的代码中的错误,或者能简化程序代码。