• 结对——二维数组首尾相连求最大子数组和


    一、题目与要求

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

      要求、1、输入一个二维整形数组,数组里有正数也有负数。

         2、二维数组首尾相接,象个一条首尾相接带子一样。

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

    二、设计思路

      在上一次的以为循环数组的基础上,和二维数组求最大子数组相结合,将功能合并,完成题目要求。

    • 第一步、将每一行的数组作为循环数组求最大子数组
    • 第二步、通过枚举的方式,将每一种情况的和存入到新建二维数组中
    • 第三部、通过逐列计算最大子数组的方法求所有子矩阵的最大和

    如:原二维数组

    1 2
    3 4

    每行求和后、

    1 1+2 2 2+1
    3 3+4 4 4+3

    逐列求和、

    1 1+2 2 2+1
    1+3 1+2+3+4 2+4 2+1+4+3
    3 3+4 4 4+3

    这样就求出了所有子矩阵的和,然后比较大小就可以了

    三、源代码

      1 // ketang5.cpp : 定义控制台应用程序的入口点。
      2 //张世通 梁世豪
      3 
      4 #include "stdafx.h"
      5 #include "iostream"
      6 using namespace std;
      7 
      8 /*二维数组压缩函数*/
      9 void yasuo(int **Source,int **Destion,int row,int line)
     10 {//将每一行的数组元素都用枚举法求出子数组
     11     int i,j,add,count;
     12     for(i=0;i<row;i++)
     13     {
     14         count=0;
     15         for(j=0;j<line;j++)
     16         {
     17             add=0;
     18             for(int l=0;l<line;l++)                            //每一行按顺序进行枚举存入数组中
     19             {
     20                 add=add+Source[i][l+j];
     21                 Destion[i][count+l]=add;
     22             }
     23             count=count+line;
     24             Source[i][line+j]=Source[i][j];
     25         }
     26     }
     27 }
     28 
     29 /*求最大值函数*/
     30 int Max(int **Destion,int row,int line)
     31 {
     32     int i,j,add,max;
     33     max=Destion[0][0];                                                //将数组的第一个数赋值给max
     34     for(j=0;j<line;j++)
     35     {
     36         for(i=0;i<row;i++)
     37         {
     38             add=0;
     39             for(int r=0;r<row-i;r++)
     40             {
     41                 add=add+Destion[r+i][j];                            //逐列对数组进行枚举,求最大值
     42                 if(max<add)
     43                 {
     44                     max=add;
     45                 }
     46             }
     47         }
     48     }
     49     return max;
     50 }
     51 
     52 /*数组初始化*/
     53 void chushihua(int**Arr,int row,int line)
     54 {
     55     cout<<"请输入数组数据"<<endl;
     56     for(int i=0;i<row;i++)
     57     {
     58         for(int j=0;j<line;j++)
     59         {
     60             cin>>Arr[i][j];
     61         }
     62     }
     63 }
     64 
     65 int main()
     66 {
     67     char s;
     68     int row,col1,col2;                                //定义行数列数
     69     cout<<"请输入行数:";
     70     cin>>row;
     71     cout<<"请输入列数:";
     72     cin>>col1;    
     73     int **A;                                        //动态定义二维数组
     74     int **B;
     75     col2=col1*col1;
     76     A=new int*[row];
     77     for(int k=0;k<row;k++)
     78     {
     79         A[k]=new int[col1];
     80     }
     81     B=new int*[row];
     82     for(int l=0;l<row;l++)
     83     {
     84         B[l]=new int[col2];
     85     }
     86     chushihua(A,row,col1);
     87     yasuo(A,B,row,col1);
     88     int max=Max(B,row,col2);
     89     cout<<"最大子数组之和为:"<<max<<endl;
     90     cout<<endl;
     91     cout<<"是否继续(Y/N)";
     92     cin>>s;
     93     while(s!='Y'&&s!='y'&&s!='N'&&s!='n')
     94     {
     95         cout<<"输入错误,请重新输入(Y/N)";
     96         cin>>s;
     97     }
     98     if(s=='Y'||s=='y')
     99     {
    100         main();
    101     }
    102     return 0;
    103 }

    四.运行截图

    五.总结体会

      1.这是我和世通在软工结对开发的最后一次合作,他一直以很积极态度来促进我们之间的合作,想法很多也都很有用,总之他是一个优秀的合作伙伴,以后有机会我还想和他一起进步。

      2.我们这次的程序基本上是沿用了之前的基本思想,有了前几次的经验,感觉这次的程序的思路就像顺水推舟一般出现在脑海中,然后的实现也比较顺利。

    六.合影

  • 相关阅读:
    Java中时间方法大全(持续更新)
    Set集合转换为List集合
    Maven配置【详细】
    maven配置环境变量
    idea中创建Java类时,自动在文件头中添加作者和创建时间
    linux下怎样在某个文件里面查找一个字符串?
    执行docker一系列命令失败
    如何在服务器上搭建SVN
    本地拉取服务器上的项目,SVN 由于目标计算机积极拒绝 无法连接失败
    [节选] web项目中使用freemarker [Translated By Nan Lei]
  • 原文地址:https://www.cnblogs.com/zglsh/p/4388191.html
Copyright © 2020-2023  润新知