结对开发2----最大子矩阵

一.题目

      返回一个整数数组中最大子矩阵的和。 二.要求   输入一个整形矩阵,矩阵里有正数也有负数。   矩阵中连续的一个或多个整数组成一个子矩阵,每个子矩阵都有一个和。   求所有子矩阵的和的最大值。要求时间复杂度为O(n)。 结对编程要求:   两人结对完成编程任务。   一人主要负责程序分析,代码编程。   一人负责代码复审和代码测试计划。

三.设计思路:

     经过和我的搭档的研究,我们最后决定以某一个数字为中心,并扩散开来分别成立1*1,1*2,1*3,2*1.2*2,2*3,3*3的子矩阵,让后通过循环嵌套结构,每次统计子矩阵的和,最后通过比较获得最大的和,最后输出。

四:代码

  1 #include <iostream>  
  2 
  3 #include <vector>  
  4 
  5 using namespace std;  
  6 
  7    
  8 
  9 const int N = 101;  
 10 
 11 int a[N][N], p[N][N];  
 12 
 13    
 14 
 15 int MaxRecSum(int n)  
 16 
 17 {  
 18 
 19     for (int i = 0; i <= n; ++i)  
 20 
 21     {  
 22 
 23         p[i][0] = 0;  
 24 
 25         p[0][i] = 0;  
 26 
 27     }     
 28 
 29     for ( i = 1; i <= n; ++i)  
 30 
 31     {  
 32 
 33         for (int j = 1; j <= n; ++j)  
 34 
 35             p[i][j] = p[i-1][j] + p[i][j-1] - p[i-1][j-1] + a[i][j];  
 36 
 37     }  
 38 
 39    
 40 
 41     int max = INT_MIN;  
 42 
 43     for ( i = 1; i <= n; ++i)  
 44 
 45     {  
 46 
 47         for (int j = i; j <= n; ++j)  
 48 
 49         {  
 50 
 51             int sum = 0;  
 52 
 53             for (int k = 1; k <= n; ++k)  
 54 
 55             {  
 56 
 57                 int temp = p[j][k] - p[j][k-1] - p[i-1][k] + p[i-1][k-1];  
 58 
 59                 if (sum > 0)  
 60 
 61                     sum += temp;  
 62 
 63                 else 
 64 
 65                     sum = temp;  
 66 
 67                 if (sum > max)  
 68 
 69                     max = sum;  
 70 
 71             }  
 72 
 73         }  
 74 
 75     }  
 76 
 77     return max;  
 78 
 79 }  
 80 
 81    
 82 
 83 int main()  
 84 
 85 {  
 86 
 87     int n = 3;  
 88 
 89     int num;  
 90 
 91     cout<<"矩阵的规格为三行三列,请输入数值:"<<endl;
 92 
 93     for (int i = 1; i <= n; ++i)  
 94 
 95     {  
 96 
 97         for (int j = 1; j <= n; ++j)  
 98 
 99         {  
100 
101             cin >> num;  
102 
103             a[i][j] = num;  
104 
105         }  
106 
107     }  
108 
109       
110 
111    
112 
113     cout <<"最大字矩阵的和为:"<< MaxRecSum(n) << endl;  
114 
115      
116 
117     for ( i = 1; i <= n; ++i)  
118 
119     {  
120 
121         for (int j = 1; j <= n; ++j)  
122 
123         {  
124 
125             cout <<a[i][j]<<"   "; 
126 
127         }  
128 
129         cout<<endl;
130 
131     }  
132 
133     return 0;  
134 
135 }


五、截图

六、心得体会

    这次的程序让我们俩很头疼,一开始都各自有一点思路,但总是被对方给的质疑搞乱,每次的循环不都能统计出全部的子矩阵的和,很多种情况都考虑不到,最后我们俩确定了一个思路之后就深挖他的循环,从内到外,讨论了很长时间。最后才完成了这个小程序。团队的力量确实很大,不过在其中也确实存在分歧,两个人各自都有各自的主见,又能给对方提问住,我觉得两个人也在这里面共同进步了。

七、合照

posted @ 2015-03-25 22:26  憨了个豆先生  阅读(150)  评论(1编辑  收藏  举报