一.实验题目

求一个二维数组中和最大的子数组。

二.实验思路

基于我们第一次合作时求的一位数组最大子数组,加上一层循环来遍历二维数组中的所有子矩阵的情况。

第一步:先利用上次的方法求每一行的情况,将每行结果存入一个一位数组中,构成一个二维数组A[][]。

第二步:将上述二维数组每一列利用求每一行的方法再次遍历。将每个结果与A[][]中的值比较取大值。

第三步:输出这个最大值。

三.代码

  1 // ketang5.cpp : 定义控制台应用程序的入口点。
  2 //人员:   张世通 梁世豪
  3
  4 #include "stdafx.h"
  5 #include "iostream"
  6 #include "fstream"
  7 using namespace std;
  8
  9 /*二维数组压缩函数*/
 10 void yasuo(int **Source,int **Destion,int row,int line)
 11 {//将每一行的数组元素都用枚举法求出子数组
 12     int i,j,add,count;
 13     for(i=0;i<row;i++)
 14     {
 15         count=0;
 16         for(j=0;j<line;j++)
 17         {
 18             add=0;
 19             for(int l=0;l<line-j;l++)                            //每一行按顺序进行枚举存入数组中
 20             {
 21                 add=add+Source[i][j+l];
 22                 Destion[i][count+l]=add;
 23             }
 24             count=count+line-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 /*释放空间*/
 66 void Delete(int **Arr,int row)
 67 {
 68     for(int i=0;i<row;i++)
 69     {
 70         delete[]Arr[i];
 71     }
 72     delete[]Arr;
 73 }
 74 int main()
 75 {
 76     char s;
 77     int row,col1,col2;                                //定义行数列数
 78     cout<<"请输入行数:";
 79     cin>>row;
 80     cout<<"请输入列数:";
 81     cin>>col1;
 82     int **A;                                        //动态定义二维数组
 83     int **B;
 84     col2=col1*(col1+1)/2;
 85     A=new int*[row];
 86     for(int k=0;k<row;k++)
 87     {
 88         A[k]=new int[col1];
 89     }
 90     B=new int*[row];
 91     for(int l=0;l<row;l++)
 92     {
 93         B[l]=new int[col2];
 94     }
 95     chushihua(A,row,col1);
 96     yasuo(A,B,row,col1);
 97     int max=Max(B,row,col2);
 98     cout<<"最大子数组之和为:"<<max<<endl;
 99     cout<<endl;
100     cout<<"是否继续(Y/N)";
101     cin>>s;
102     while(s!='Y'&&s!='y'&&s!='N'&&s!='n')
103     {
104         cout<<"输入错误,请重新输入(Y/N)";
105         cin>>s;
106     }
107     if(s=='Y'||s=='y')
108     {
109         main();
110     }
111     else                                            //释放数组空间
112     {
113         Delete(A,row);
114         Delete(B,row);
115     }
116     return 0;
117 }

四.运行截图

五.收获体会

第一点,这次结对开发的过程让我学会了利用已有资源进行程序的开发,正是有了上次一位数组求最大子数组的基础,这次求二维数组最大子数组才有了正确的思路。

第二点,这是和世通的第二次结对开发程序,他的思路很清晰,编程能力也很好,有很多值得我学习的地方。以后应该还有很多合作的机会,我都会珍惜的。

第三点,我觉得结对开发这个主意应该早点应用到我们的学习中,这种方法下我们会尽力去思考问题的解决方法,基础差一点的在另一方的影响下也会学到不少实用的东西。而不是遇见不会的就百度一个程序去应付老师而造成恶性循环,给自己扣上一个“不会编程”的帽子来逃避。

六.合影

转载于:https://www.cnblogs.com/zglsh/p/4369598.html

二维数组最大子数组和相关推荐

  1. 编程之美2.15 二维数组最大子数组的和(数组下标从(1,1)开始)

          首先,我们看到这篇文章的题目,我们就会想到之前的那个题目 -- 连续子数组最大和问题.这个问题无疑就是把原问题扩展到二维的情况.       想起来这个问题也不是很难,我们可以求解一维矩阵 ...

  2. 求一个二维整数数组最大子数组之和,时间复杂度为N^2

    本随笔只由于时间原因,我就只写写思想了   二维数组最大子数组之和,可以  引用  一维最大子数组之和 的思想 一维最大子数组之和 的思想,在本博客上有,这里就不做多的介绍了 我们有一个最初的二维数组 ...

  3. 返回一个二维整数数组最大子数组的和

     要求: 1,输入一个二维整形数组,数组里有正数也有负数. 2,二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和, 3,求所有子数组的和的最大值. 设计思路: 参照一维整数数组求解最大子 ...

  4. 环状二维数组最大子数组求和

    题目:返回一个二维整数数组中最大子数组的和.要求:输入一个二维整形数组,数组里有正数也有负数.二维数组首尾相接,象个一条首尾相接带子一样. n数组中连续的一个或多个整数组成一个子数组,每个子数组都有一 ...

  5. HDU2642(二维的树状数组)

    二维的树状数组,我记得是模版!^ _ ^ 题意很清楚:就是这部分的原理:sum(x1,y1)+sum(x2-1,y2-1)-sum(x1,y2-1)-sum(x2-1,y1);其实可以和概率论中的一个 ...

  6. 间接通过new 来申请一个二维的堆内存数组

    我们知道无法直接通过new 来申请一个二维的堆内存数组,于是有人想出了这样一个办法:创建一个一维堆内存指针数组,即每个数组元素是一个指针,然后用new 给各个指针分配一个一维的堆内存数组,那么最后表示 ...

  7. matlab 三维数组运算,MATLAB二维三维画图仿真数组运算

    MATLAB二维三维画图仿真数组运算 1. 数学 (1) 数组运算: x=[1 2 3 4]; y=[3 4 5 6]; z=x+y %数组x与数组y相加得到数组z z = 4 6 8 10 z=x- ...

  8. 关于图的二维矩阵转为一维数组的理解。

    一开始看二维矩阵转为一维数组的时候还是有点懵的,为啥是N(N+1)/2呢,为啥不是N*N/2呢,这个矩阵明明是N*N的一个正方形啊,我要省一半空间直接除2不就行了,带着这个问题我观察了一下这个PPT里 ...

  9. 一维循环数组最大子数组求解

    #include "stdafx.h" #include <stdio.h> int _tmain(int argc, _TCHAR* argv[]) {int i, ...

最新文章

  1. The FBX plug-in does not support objects set to By Object mode in the Object Properties Display
  2. oracle bi publisher 安装,Oracle BI Publisher 企业版安装后的配置(BI Publisher Enterpr
  3. ts包、表、子表、section的关系
  4. SSM整合(2): spring 与 mybatis 整合
  5. mysql long raw_读取Oracle数据库中LONG RAW字段会抛出异常
  6. git 学习之基础知识
  7. sudo: apt-get:找不到命令”的解决方法
  8. 有1~5000一组乱序数列,请使用伪代码对该数进行排列
  9. mysql常见错误解决方法_mysql常见错误解决办法
  10. 苹果4是android吗,时至2020年,苹果手机还有这几个优势,让安卓毫无“招架之力”...
  11. 开发中为组件添加预览信息
  12. Ubuntu安装nextcloud-17.0.1
  13. Android:文件读写.
  14. C++生产和使用的临时对象
  15. React Concurrent Mode 之 Suspense 实践
  16. matlab中ode的用法,关于matlab 的ode45用法
  17. 为什么你应聘不上或试用期被开?
  18. 深入了解浏览器的垃圾回收
  19. 通过冥想解除困意,提升精神
  20. 程序与进程的区别和联系

热门文章

  1. java语言执行模式,使用java.exe执行静默模式
  2. linux终端美化,如何美化你的命令行终端Terminal
  3. dns服务器系统架构,详解 DNS 与 CoreDNS 的实现原理
  4. Java反射 field
  5. ftp服务器收集文件,ftp服务器收集文件
  6. mysql5.7循环,python3.4用循环往mysql5.7中写数据并输出的实现方法
  7. 基于java SSM springboot景区行李寄存管理系统设计和实现
  8. linux如何卸载conky,Linux Deepin 15.10.2 下折腾 简单自制的 Conky Conky-manager
  9. MySQL 查询数据表
  10. 判断三角形是否是直角三角形