最大子段和扩展(二维)
1. 题目:参见编程之美P189页。
2. 分析:详细算法书上说的很明确,学会这个分析过程。
具体代码如下:
1 //二维最大子段和问题 2 int maxSum(int **a,int row,int col, 3 int& i_min,int& j_min,int& i_max,int& j_max) 4 { 5 int **p=new int *[row+1]; 6 for (int i=0;i<=row;i++) 7 { 8 p[i]=new int[col+1]; 9 } 10 for (int i=0;i<=row;i++) 11 { 12 p[i][0]=0; 13 } 14 for (int i=0;i<=col;i++) 15 { 16 p[0][i]=0; 17 } 18 for (int i=1;i<=row;i++) 19 { 20 for (int j=1;j<=col;j++) 21 { 22 p[i][j]=p[i-1][j]+p[i][j-1]-p[i-1][j-1]+a[i-1][j-1]; 23 } 24 } 25 26 int matrixSum=INT_MIN; 27 for (int i=1;i<=row;i++) 28 { 29 for (int j=i;j<=row;j++) 30 { 31 int b=0; 32 int sum=INT_MIN; 33 int tmpk=0; 34 int tmpjmin=0; 35 int tmpjmax=0; 36 for (int k=1;k<=col;k++) 37 { 38 if (b<0) 39 { 40 b=0; 41 tmpk=k; 42 } 43 b+=p[j][k]-p[j][k-1]-p[i-1][k]+p[i-1][k-1]; 44 if (b>sum) 45 { 46 sum=b; 47 tmpjmin=tmpk; 48 tmpjmax=k; 49 } 50 } 51 if (sum>matrixSum) 52 { 53 i_min=i; 54 i_max=j; 55 j_min=tmpjmin; 56 j_max=tmpjmax; 57 matrixSum=sum; 58 } 59 } 60 } 61 62 for (int i=0;i<=row;i++) 63 { 64 delete[] p[i]; 65 } 66 delete[] p; 67 return matrixSum; 68 } 69 70 int main() 71 { 72 ifstream infile("test.txt"); 73 if (!infile) 74 { 75 return -1; 76 } 77 int row=0; 78 int col=0; 79 infile>>row; 80 infile>>col; 81 int **matrix=new int *[row]; 82 for (int i=0;i<row;i++) 83 { 84 matrix[i]=new int[col]; 85 } 86 for (int i=0;i<row;i++) 87 { 88 for (int j=0;j<col;j++) 89 { 90 infile>>matrix[i][j]; 91 } 92 } 93 int i_min=0; 94 int j_min=0; 95 int i_max=0; 96 int j_max=0; 97 int result=0; 98 result=maxSum(matrix,row,col,i_min,j_min,i_max,j_max); 99 cout<<result<<endl; 100 cout<<i_min<<","<<j_min<<" "<<i_max<<","<<j_max<<endl; 101 for (int i=i_min;i<=i_max;i++) 102 { 103 for (int j=j_min;j<=j_max;j++) 104 { 105 cout<<matrix[i-1][j-1]<<" "; 106 } 107 cout<<endl; 108 } 109 cout<<endl; 110 for (int i=0;i<row;i++) 111 { 112 delete[] matrix[i]; 113 } 114 delete[] matrix; 115 infile.close(); 116 return 0; 117 }
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