最大子段和扩展(二维)

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

转载于:https://www.cnblogs.com/ZJUKasuosuo/archive/2012/09/14/2685173.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值