zoukankan      html  css  js  c++  java
  • 返回一个二维整数数组中最大子数组的和(二人结对)

    题目:返回一个二维整数数组中最大子数组的和

    要求:1.输入一个二维整型数组,数组里有正数也有负数。

               2.二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和。

               3.求所有子数组的和的最大值。

    设计思想: 二维数组求最大子数组可以简化成多个一维数组比较求最大 。

           1.首先在用户输入行数列数以及相应二维数组后,即确定了数组列数的最大上界,从第一列开始确定最大子数组范围。

           2.对于规定好的最大子数组的范围,把数组分成几组有不同的列的数组(如第一组只有一列,第二组有两列等,而行数则和原数组的行数相同)。

           3.对于以上产生的几个数组,用一维数组求子数组之和最大值的方法,依次求出最大值,比较,保留最大的。

           4.然后从最大上界依次减小,重复以上步骤。

    源代码为:

     1 #include<iostream>
     2 #include<stdlib.h>
     3 using namespace std;
     4 
     5 void main ()
     6 {
     7     int x,y,i,j,m=0;
     8     cout<<"Please enter the number of rows for an array:";
     9     cin>>x;
    10     cout<<"Please enter the number of columns in the array:";
    11     cin>>y;
    12     int *A = new int[x*y];
    13     cout<<"Enter the array:"<<endl;
    14     for(i=0;i<x;i++)
    15     {
    16         for(j=0;j<y;j++)
    17         {
    18             cin>>A[i*y+j];   //表示第i行第j列元素(注意i乘的是列数)
    19         }
    20     }
    21     int sum[100]={0},MaxSum=A[0];
    22     //以列为基准进行循环(即先竖着加)
    23     for(j=0;j<y;j++)       //确定子数组的列数(用输入的y确定)
    24     {
    25         for(m=0;m<y;m++)       //确定子数组有j(j不超过y-m)行
    26         {
    27             for(i=0;i<x;i++)
    28             {
    29                 sum[i]=sum[i]+A[i*y+(m+j)];
    30             }
    31             int max=0;   //初始化定义一个值为零的max
    32             for(i=0;i<x;i++)
    33             {
    34                 if(max+sum[i]>sum[i])
    35                 {
    36                     max=max+sum[i];
    37                 }
    38                 else
    39                 {
    40                     max=sum[i];
    41                 }
    42                 if(max>MaxSum)
    43                 {
    44                    MaxSum=max;
    45                 }
    46             }
    47         }
    48         //初始化sum[i]的值,使子数组最大上界下降1,之后重新循环。
    49         for(i=0;i<x;i++)
    50         {
    51             sum[i]=0;
    52         } 
    53     }
    54     cout<<"The sum of the largest subarray is:"<<MaxSum<<endl;
    55     system("pause");
    56 }

    结果截图:

                   

    总结与体会:1.最开始,为了确保求和的数组的确是矩阵,我们尝试了用一步一步的循环分别将一行矩阵,二行矩阵,三行矩阵分类相加,类内比较,再类间比较取最大的方法,但是前提是我们输入的原二维数组是3行3列的,这种情况下代码就已经很多了,而一旦数组再有任何变化就要修改整个程序,这种方法的复杂与笨拙就显示出来了。之后,我们在经过观察和总结网上的例子作参考以后,写出了以上源代码,目前为止我们都觉得这样的代码既能满足要求又比较容易理解。

    2.学习了如何用new定义二维数组:

    以m*n举例:
    第一种方法:
    int **a = new int*[m];
    for(int i=0; i < m; i++)
    a[i] = new int[n];
    第二种方法:
    int* a = new int[m*n];
    a[i*n+j]是第i行第j列元素

    3.双人结对编程的确可以提高效率,看来以后不仅需要提高自己的能力,更需要多多增强团队合作意识与能力。

    合作美图:

                                                

                                                   (   20163953  关甜欢                     20163955  王美仪  )

  • 相关阅读:
    (最小生成树) 畅通工程再续 -- HDU --1875
    (最小生成树)Jungle Roads -- HDU --1301
    (最小生成树 )还是畅通工程 -- HDU--1233
    不同版本的 IIS 中使用 ASP.NET MVC(C#)【转】
    我们应当怎样做需求分析【转】
    C# DataTable几个常用的查询表达式【转】
    C# DataTable转实体 通用方法【转】
    C# 如何利用反射来加载程序集,并调用程序集中有关类的方法【转】
    IEnumerable和IEnumerator 详解 【转】
    循环对XML文档添加Attribute以及移除Element 【转】
  • 原文地址:https://www.cnblogs.com/shenzhenxi/p/9822717.html
Copyright © 2011-2022 走看看