zoukankan      html  css  js  c++  java
  • 2、软件工程结对开发之求二维数组中连续最大子数组之和

    一、题目:

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

    二、要求:

    输入一个二维整型数组,数组里有正数也有负数。

    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    求所有子数组的和的最大值。要求时间复杂度为O(n)。

    结对编程要求: 两人结对完成编程任务。

    一人主要负责程序分析,代码编程。

    一人负责代码复审和代码测试计划。

    程序要使用的数组放在一个叫 input.txt 的文件中,  文件格式是:
    数组的行数,
    数组的列数,
    每一行的元素,  (用逗号分开)
    每一个数字都是有符号32位整数, 当然, 行数和列数都是正整数。

    发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。

    三、合作过程与体会

      本次试验我们是在上次试验的基础上,还是利用一维动态数组,本次用穷举法先假设一数组元素P[i][j],之后求每个子数组之和并求其最大子数组之和,首先初始化max[0][0],以(0,0)为起点,假设一数组元素P[i][j]。求起点是第a行,终点是第c行,以(i,j)为终点的的连续子数组的和,之后转换为求一维连续子数组的和;这样求得所有子数组之和,然后就开始找所有子数组中和的最大值。不过缺陷是这样时间花费比较多,而且我们没有用文件来实现,只是在程序中输入输出。

    四、源程序代码

      1 #include <iostream.h>
      2 int maxSubArray(int **a,int n,int m)
      3 {
      4     int **p=new int*[n];
      5     int i,j;
      6     if(m==0||n==0)
      7         return 0;
      8     //计算p[i][j]    
      9     for(i=0;i<n;i++)
     10     {
     11         p[i]=new int[m];
     12         for(j=0;j<m;j++)
     13         {
     14             if(i==0)
     15             {
     16                 if(j==0)
     17                     p[i][j]=a[i][j];
     18                 else
     19                     p[i][j]=p[i][j-1]+a[i][j];
     20             }
     21             else
     22             {
     23                 if(j==0)
     24                     p[i][j]=p[i-1][j]+a[i][j];
     25                 else
     26                     p[i][j]=p[i][j-1]+p[i-1][j]-p[i-1][j-1]+a[i][j];
     27             }
     28         }
     29     }
     30     //计算二维数组最大子数组的和
     31     int temp;
     32     int max=a[0][0];//初始化
     33     int sum;
     34     if(m==1)
     35     {
     36         for(i=0;i<n;i++)
     37         {
     38             for(j=i;j<n;j++)
     39             {
     40                 if(i==0)
     41                 {
     42                     temp=p[j][m-1];
     43                 }
     44                 else
     45                 {
     46                     temp=p[j][m-1]-p[i-1][m-1];
     47                 }
     48                 if(sum<temp)
     49                     sum=temp;
     50             }
     51         }
     52     }
     53     else
     54     {
     55         for(i=0;i<n;i++)
     56         {
     57             for(j=i;j<n;j++)
     58             {
     59                 if(i==0)
     60                 {
     61                     temp=p[j][m-1]-p[j][m-2];
     62                 }
     63                 else
     64                 {
     65                     temp=p[j][m-1]-p[j][m-2]-p[i-1][m-1]+p[i-1][m-2];
     66                 }
     67                 for(int k=m-2;k>=0;k--)
     68                 {
     69                     if(temp<0)
     70                         temp=0;
     71                     if(i==0)
     72                     {
     73                         if(k==0)
     74                             temp+=p[j][k];
     75                         else
     76                             temp+=p[j][k]-p[j][k-1];
     77                     }
     78                     else
     79                     {
     80                         if(k==0)
     81                             temp+=p[j][k]-p[i-1][k];
     82                         else
     83                             temp+=p[j][k]-p[j][k-1]-p[i-1][k]+p[i-1][k-1];
     84                     }
     85                     if(sum<temp)
     86                         sum=temp;
     87                 }
     88             }
     89         }
     90     }
     91     return sum;
     92 }
     93 
     94 int main()
     95 {
     96     int n;//行数
     97     int    m;//列数
     98     cout<<"请输入二维数组的行数:"<<endl;
     99     cin>>n;
    100     cout<<"请输入二维数组的列数"<<endl;
    101     cin>>m;
    102     int i,j;
    103     int **a=new int*[n];
    104     cout<<"请输入该二维数组元素:"<<endl;
    105     for(i=0;i<n;i++)
    106     {
    107         a[i]=new int[m];
    108         
    109         for(j=0;j<m;j++)
    110         {
    111             cin>>a[i][j];
    112         }
    113     }
    114     int sum;//最大字数组的和 
    115     sum=maxSubArray(a,n,m);
    116     cout<<"二维数组的最大子数组之和:"<<sum<<endl;
    117     return 0;
    118 }

    五、工作照

     

  • 相关阅读:
    android开发之AlertDialog点击按钮之后不消失
    FaceBook要在视频领域打败YouTube?
    POJ 1469 COURSES
    图论trainning-part-2 C. The Largest Clique
    hdu 1269 迷宫城堡
    图论trainning-part-2 B. Claw Decomposition
    图论trainning-part-1 H. Qin Shi Huang's National Road System
    xtu数据结构 H. City Horizon
    图论trainning-part-1 E. Invitation Cards
    图论trainning-part-1 F. Highways
  • 原文地址:https://www.cnblogs.com/czl123/p/4364152.html
Copyright © 2011-2022 走看看