返回一个二维整数数组中最大子数组的和。

设计思路:

  通过之前一维环,进行拓展,成数组。

代码:

 1 //XiaoSong Du 2015/4/20
 2 #include <iostream>
 3 #include <time.h>
 4 using namespace std;
 5 #define M 3
 6 #define N 6
 7 
 8 void main()
 9 {
10     int a[M][2*N]={0},b[2*N],d = 0,d1 = 0;
11     int maxd[2*N]={0} ,end1[2*N] = {0},end2 = 0;
12     int i_max = 0,j_max = 0 ,jj = -1,j1 = 0,j2 = -1;
13 
14     srand((unsigned int)time(0));    
15 
16     for (int i = 0;i < M;i++)
17     {
18         for (int j = 0;j < N;j++)
19         {
20             a[i][j] = rand()%50 - 25;
21             a[i][j+N] = a[i][j];
22             cout << a[i][j] << " ";
23         }    
24         cout << endl;
25     }
26 
27     maxd[0] = a[0][0];
28     for (int i = 0;i < M;i++)//i为0,表示1行,i为1表示两行数···
29     {
30         for (int i_hang = 0;i_hang < M-i;i_hang++)//当1行是循环3次
31         {
32             for (int j = 0;j < 2*N;j++)//赋初值
33             {
34                 b[j] = 0;
35             }
36             for (int i_hang1 = i_hang;i_hang1 <= i_hang+i;i_hang1++)//每次循环i次赋值
37             {
38                 for (int j = 0;j < 2*N;j++)
39                 {
40                     b[j] += a[i_hang1][j];
41                 }
42             }
43             d = 0;j2 = -1;j1=0;jj=-1;
44             for (int ii = 0;ii < 2*N;ii++)
45             {    
46                 d += b[ii]; 
47                 if (d > maxd[j1-1])
48                 {
49                     maxd[j1] = d;
50                     end1[j1] = ii;
51                     i_max = i;       //最大的时候是i行;
52                     j_max = i_hang;   //
53                     j1++;
54                     j2 = jj;
55                 }
56                 if(d < 0)
57                 {
58                     d = 0;
59                     jj = ii;
60                 }
61 
62                 if (end1[j1-1] - j2 > N)   //如果end1[j1-1] - j2大于N个数,那么就获取end1[j1-2]
63                 {    
64                     j1--;
65                     break;
66                 }
67             }
68             end2 = j2+1;            
69         }
70     }    
71     cout << "子数组为:" << endl;
72     
73     for (int k = 0;k <= i_max;k++)
74     {
75         for (int i = end2;i <= end1[j1-1];i++)
76         {
77             cout << a[j_max+k][i] << " ";
78         }
79         cout << endl;
80     }
81     cout << endl;
82     cout << "和为: " << maxd[j1-1] << endl;    
83 }

结果截图:

返回一个二维整数数组中最大子数组的和。返回一个二维整数数组中最大子数组的和。返回一个二维整数数组中最大子数组的和。

总结:
  

  

  在整合的过程中发生了一列错误,以至于到时间都没完善代码,只能先把博客发表,之后慢慢完善。程序多次运行后会出错误,可是大概是思路僵化的原因,就是解决不了。暂时先凉一下吧。