• 5、软件工程结对开发之求一维数组中连续最大子数组之和


    一、题目:返回一个二维整数数组中最大子数组的和。
    二、要求:
    输入一个二维整形数组,数组里有正数也有负数。
    二维数组首尾相接,象个一条首尾相接带子一样。
    数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
    求所有子数组的和的最大值。要求时间复杂度为O(n)。

    三、设计思想

      这个实验是在前几次实验的基础上,利用动态数组,为了满足首尾相连,所以在计算一次之后,要把该数放在数组的最后边,这样循环遍历最后求出最大子数组的和。

    四、源代码

      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     int sum;//最大子数组的和 
     99     int i,j;
    100     cout<<"请输入二维数组的行数:"<<endl;
    101     cin>>n;
    102     cout<<"请输入二维数组的列数"<<endl;
    103     cin>>m;
    104     
    105     int **a=new int*[n];
    106     cout<<"请输入该二维数组元素:"<<endl;
    107     for(i=0;i<n;i++)
    108     {
    109         a[i]=new int[m];
    110         for(j=0;j<m;j++)
    111         {
    112             cin>>a[i][j];
    113         }
    114     }
    115     
    116     sum=maxSubArray(a,n,m);
    117     cout<<"二维数组的最大子数组之和:"<<sum<<endl;
    118     return 0;
    119 }

    五、实验总结

      本次试验,我们俩互换了角色,我负责代码编写、程序分析,檀威负责代码复审和代码测试计划,体会到了角色互换后的不同的感受,实验中我们改了好多次,对变量的重复利用不恰当,有时候不同的含义变量我们却用了相同的变量表示,有些混乱,以后在编程时要先考虑好变量的含义,做到见名知义。

    六、合作照片

  • 相关阅读:
    Hive之安装
    python3常用内置方法(持续更新中。。。)
    CentOS7下安装Python3及Pip3并保留Python2
    一个爬取52破解的全部帖子地址的简单爬虫
    在windows写入文件中遇到 UnicodeEncodeError: ‘gbk’ codec can’t encode character 错误的解决办法
    我的vim配置
    树莓派命令行模式调整音量
    树莓派更改软件源
    linux连接wifi
    给树莓派挂载移动硬盘或U盘
  • 原文地址:https://www.cnblogs.com/czl123/p/4388217.html
Copyright © 2020-2023  润新知