最大子段和扩展(二维)
2012-09-14 16:37
399 查看
1. 题目:参见编程之美P189页。
2. 分析:详细算法书上说的很明确,学会这个分析过程。
具体代码如下:
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
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
相关文章推荐
- poj 1050 To the Max(动态规划处理二维最大子段和)
- HDU-1081-To The Max(二维最大子段和)
- 最大子段和系列(二维子段和、环形数组子段和、最大m段和) 思路
- POJ-1050 To the Max 二维最大子段和
- POJ 1050 To the Max ——二维最大子段和
- Maximum sum 二维最大子段和
- hdu 1081 (最大子段和的升级版,二维)
- HDU1003+数组最大子序列和及其扩展(循环数组,二维矩阵等)
- hdu 1081 To The Max(最大子段和的升级版,二维)
- hoj 2558 二维最大子段和
- hoj 2558 二维最大子段和
- hdu1081 DP类最大子段和(二维压缩+前缀和数组/树状数组计数)
- 最大子段和的以为与二维求解
- ZOJ 1074 To the Max【DP】【最大子段和】
- 分治法求最大子段和
- HDU 1540(线段树,以一点扩展开的最大连续区间)
- 二分图最大独立集 二维动态数组 杭电1068
- UVALive2288 POJ1050 HDU1081 ZOJ1074 To The Max【最大子段和+DP】
- 每日一道算法题:求一个矩阵中最大的二维矩阵(元素和最大)
- 编程之美寻找数组中的最大值和最小值以及扩展问题