• 结对开发-求环状二维数组最大子数组


    结对成员:信1201-1班    黄亚萍

      信1201-1班    袁亚姣

    一、题目要求

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

    二、设计思路

          类似于3,将二维数组转化为一维数组来求最大子数组的和,并输出其最大子数组。

    三、程序源代码 

      1 #include <iostream>
      2 #include <fstream>
      3 using namespace std;
      4 # define M 100
      5 # define N 100
      6 int hang1=0;
      7 int hang2=0;
      8 int lie1=0;
      9 int lie2=0;
     10 int maxx = -100;
     11 int sum1(int k,int a[],int number)    //一维数组行数元素求和
     12 {
     13     int x=0;
     14     for(int i=k;i<=number+k-1;i++)    //数组元素的个数为number
     15     {
     16         x=x+a[i];
     17     }
     18     return x;
     19 }
     20 int sum2(int k,int a[M][N],int number,int num)   //二维数组列数元素求和
     21 {
     22     int x=0;
     23     for(int i=k;i<=number+k-1;i++)    
     24     {
     25         x=x+a[i][num];
     26     }
     27     return x;
     28 }
     29 int Largest1(int list1[],int length)         //一维数组求数组的子数组的和的最大值
     30 {
     31     int sum[N];
     32     int i,j,max=-100;
     33     for(i=1;i<=length;i++)       //元素个数为i
     34     {    
     35         for(j=1;j<=2*length-1-i+1;j++)   //子数组的第j个元素,求最大值
     36         {
     37              sum[j]=sum1(j,list1,i);
     38              if(sum[j]>=max) 
     39             {
     40                 max=sum[j];
     41             }
     42         }        
     43     }    
     44     return max;
     45 }
     46 
     47 void Largest3(int list[],int length)         
     48 {
     49     int sum[N];
     50     int i,j;
     51     for(i=1;i<=length;i++)       
     52     {    
     53         for(j=1;j<=2*length-1-i+1;j++)  
     54         {
     55             sum[j]=sum1(j,list,i);
     56             if(sum[j]>= maxx) 
     57             {
     58                 maxx=sum[j];
     59                 lie1 = j;
     60                 lie2 = j+i-1;
     61             }
     62         }        
     63     }    
     64 }
     65 
     66 int Largest2(int list[M][N],int number_x,int number_y)   //二维数组求数组的子数组的和的最大值
     67 {
     68     int max,m;
     69     int max2[N];
     70     int sum[M][N];
     71     int max3[N];
     72     for(int i=1;i<=number_x;i++)   //数组行数为i
     73     {
     74         cout<<"子数组行数为"<<i<<","<<endl;
     75 
     76         for(m=1;m<=number_x-i+1;m++)    //子数组的第一行为原数组的第m行
     77         {  
     78             cout<<""<< m <<"行的最大值为:";
     79             for(int j=1;j<=2*number_y-1;j++)    //子数组第j列元素
     80             {            
     81                 sum[i][j]=sum2(m,list,i,j);                    
     82             }    
     83             Largest3(sum[i],number_y);
     84             max2[m]=Largest1(sum[i],number_y);    //数行数为i时子数组第m行的最大值
     85             cout<<max2[m]<<endl; 
     86             max3[i]=max2[1];
     87             for(int k=1;k<=i;k++)     
     88             {
     89                 if(max2[k]>=max3[i])
     90                 {
     91                     max3[i]=max2[k];
     92                     hang1=m;
     93                 }
     94             }            
     95         }        
     96     }
     97     max=max3[1];
     98     for(int n=1;n<=number_x;n++)     
     99     {
    100         if(max3[n]>=max)
    101         {
    102             max=max3[n];
    103             hang1=m;
    104             hang2=n;      //子数组的行数为第m行到第m+n行
    105 
    106         }
    107     }            
    108     return max;
    109 }
    110 void show(int arry[N][N],int length1,int length2)   //输出矩阵
    111 {
    112     for(int i=1;i<=length1;i++)
    113     {
    114         for(int j=1;j<=length2;j++)
    115         {
    116             cout<<arry[i][j]<<"	";
    117         }
    118         cout<<endl;
    119     }
    120 }
    121 int main(int argc, char* argv[])
    122 {
    123     int i,j,number_hang,number_lie;
    124     int list[M][N],list1[M][N];
    125 
    126     ifstream infile("input.txt");
    127     if(!infile)
    128         cout<<"读取失败!"<<endl;
    129     else
    130     {
    131         infile>>number_hang>>number_lie;
    132         for(int i=1;i<=number_hang;i++)
    133         {
    134             for(int j=1;j<=number_lie;j++)
    135             {
    136                 infile>>list[i][j];
    137             }
    138         }
    139     }
    140 
    141     cout<<"以矩阵形式展示为:"<<endl;
    142     show(list,number_hang,number_lie);
    143     cout<<endl;
    144 
    145     cout<<"等价转换的数组为:"<<endl;
    146     for(j=1;j<=number_hang;j++)
    147     {
    148         for( i=1;i<=2*number_lie-1;i++)
    149         {
    150             if(i<=number_lie)
    151             {
    152                 list1[j][i]=list[j][i];
    153             }
    154             else
    155             {
    156                 list1[j][i]=list[j][i-number_lie];
    157             }
    158             cout<<list1[j][i]<<" ";
    159         }
    160         cout<<endl;
    161     }
    162     
    163 
    164     cout<<"最大值为:"<<Largest2(list1,number_hang,number_lie)<<endl;
    165     cout<<endl;
    166     cout<<"对应的最大值的子数组为:"<<endl;
    167 
    168     for(i=hang1-1;i<hang2+hang1-1;i++)
    169     {
    170         for(int j=lie1;j<=lie2;j++)
    171         {
    172             cout<<list1[i][j]<<"	";
    173         }
    174         cout<<endl;
    175     }
    176     cout<<endl;
    177     return 0;
    178 }

    四、运行结果截图

    五、心得体会

    在这个过程中,我在深深的我们的默契越来越好了,我们在一起讨论问题,整个问题也越来越复杂,但是在原来的基础上,感觉难度小了许多。

  • 相关阅读:
    87后的我
    meta标签中的httpequiv属性
    System.IO.Directory.GetCurrentDirectory与System.Windows.Forms.Application.StartupPath的用法
    递归方法重现
    实现控件的随意拖动
    Sql Server 2005 如何自动备份数据库
    用C#打开Windows自带的图片传真查看器
    配置SQL Server2005以允许远程访问
    Gridview控件有关的一些设置
    Add the Child Pane to Root.plist in the setting.bundlle
  • 原文地址:https://www.cnblogs.com/yuanyajiao/p/4388532.html
Copyright © 2020-2023  润新知