您的位置:首页 > 其它

最大子段和扩展(二维)

2012-09-14 16:37 399 查看
1. 题目:参见编程之美P189页。

2. 分析:详细算法书上说的很明确,学会这个分析过程。

具体代码如下:

//二维最大子段和问题
int maxSum(int **a,int row,int col,
int& i_min,int& j_min,int& i_max,int& j_max)
{
int **p=new int *[row+1];
for (int i=0;i<=row;i++)
{
p[i]=new int[col+1];
}
for (int i=0;i<=row;i++)
{
p[i][0]=0;
}
for (int i=0;i<=col;i++)
{
p[0][i]=0;
}
for (int i=1;i<=row;i++)
{
for (int j=1;j<=col;j++)
{
p[i][j]=p[i-1][j]+p[i][j-1]-p[i-1][j-1]+a[i-1][j-1];
}
}

int matrixSum=INT_MIN;
for (int i=1;i<=row;i++)
{
for (int j=i;j<=row;j++)
{
int b=0;
int sum=INT_MIN;
int tmpk=0;
int tmpjmin=0;
int tmpjmax=0;
for (int k=1;k<=col;k++)
{
if (b<0)
{
b=0;
tmpk=k;
}
b+=p[j][k]-p[j][k-1]-p[i-1][k]+p[i-1][k-1];
if (b>sum)
{
sum=b;
tmpjmin=tmpk;
tmpjmax=k;
}
}
if (sum>matrixSum)
{
i_min=i;
i_max=j;
j_min=tmpjmin;
j_max=tmpjmax;
matrixSum=sum;
}
}
}

for (int i=0;i<=row;i++)
{
delete[] p[i];
}
delete[] p;
return matrixSum;
}

int main()
{
ifstream infile("test.txt");
if (!infile)
{
return -1;
}
int row=0;
int col=0;
infile>>row;
infile>>col;
int **matrix=new int *[row];
for (int i=0;i<row;i++)
{
matrix[i]=new int[col];
}
for (int i=0;i<row;i++)
{
for (int j=0;j<col;j++)
{
infile>>matrix[i][j];
}
}
int i_min=0;
int j_min=0;
int i_max=0;
int j_max=0;
int result=0;
result=maxSum(matrix,row,col,i_min,j_min,i_max,j_max);
cout<<result<<endl;
cout<<i_min<<","<<j_min<<"   "<<i_max<<","<<j_max<<endl;
for (int i=i_min;i<=i_max;i++)
{
for (int j=j_min;j<=j_max;j++)
{
cout<<matrix[i-1][j-1]<<"  ";
}
cout<<endl;
}
cout<<endl;
for (int i=0;i<row;i++)
{
delete[] matrix[i];
}
delete[] matrix;
infile.close();
return 0;
}


test.txt文件内容如下:

6 5
1 -1 2 -2 3
-4 5 -4 6 4
-1 -2 -3 -4 5
10 -11 3 4 -5
-6 -1 -2 -2 -5
7 -2 -4 -5 10

运行结果:

13
1,2 2,5
-1 2 -2 3
5 -4 6 4
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: