zoukankan      html  css  js  c++  java
  • 结对开发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 }


    五、截图

    六、心得体会

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

    七、合照

  • 相关阅读:
    dockerfile 踩坑记录
    Windows安装配置xampp
    docker 容器中设置 mysql lampp php软链接
    linux 软件连接 创建/查看/删除
    mysql 远程连接权限
    linux设置静态获取ip
    android 自定义控件中获取属性的三种方式(转)
    android 自定义组件-带图片的textView
    CodeIgniter 3之Session类库(3)(转)
    CodeIgniter 3之Session类库(2)(转)
  • 原文地址:https://www.cnblogs.com/fan123/p/4367229.html
Copyright © 2011-2022 走看看