环状二维数组最大子数组求和
题目:返回一个二维整数数组中最大子数组的和。要求:输入一个二维整形数组,数组里有正数也有负数。二维数组首尾相接,象个一条首尾相接带子一样。
结对编程要求: 两人结对完成编程任务。 一人主要负责程序分析,代码编程。
一人负责代码复审和代码测试计划。
发表一篇博客文章讲述两人合作中的过程、体会以及如何解决冲突(附结对开发的工作照)。
结对开发过程:
这次的编程开发是基于上次的以为数组,我和我的搭档@天使RL恶魔开始了认真的讨论,再结合课堂上的同学讨论,如何能在二维数组原有的基础上,加上首尾相连这个条件,同时降低时间复杂度,这种方法的大概思想是:遍历数组里面的每一个数将第一个数变为最后一个数,具体算法 a[i][j-1]=a[i][j],这样又变成了一个新的二维数组,输出每个数组的最大子数组和,然后比较每个输出的和,找出最大的数。
程序代码:
1 #include <iostream> 2 using namespace std; 3 4 int maxSubArray(int **a,int n,int m) 5 { 6 int **p=new int*[n]; 7 int i,j; 8 if(m==0||n==0) 9 return 0; 10 //计算p[i][j] 11 for(i=0;i<n;i++) 12 { 13 p[i]=new int[m]; 14 for(j=0;j<m;j++) 15 { 16 if(i==0) 17 { 18 if(j==0) 19 p[i][j]=a[i][j]; 20 else 21 p[i][j]=p[i][j-1]+a[i][j]; 22 } 23 else 24 { 25 if(j==0) 26 p[i][j]=p[i-1][j]+a[i][j]; 27 else 28 p[i][j]=p[i][j-1]+p[i-1][j]-p[i-1][j-1]+a[i][j]; 29 } 30 } 31 } 32 //计算二维数组最大子数组的和 33 int temp; 34 int max=a[0][0]; 35 int ans; 36 //如果m==1 37 if(m==1) 38 { 39 for(i=0;i<n;i++) 40 { 41 for(j=i;j<n;j++) 42 { 43 if(i==0) 44 { 45 temp=p[j][m-1]; 46 } 47 else 48 { 49 temp=p[j][m-1]-p[i-1][m-1]; 50 } 51 if(ans<temp) 52 ans=temp; 53 } 54 } 55 } 56 else 57 { 58 for(i=0;i<n;i++) 59 { 60 for(j=i;j<n;j++) 61 { 62 if(i==0) 63 { 64 temp=p[j][m-1]-p[j][m-2]; 65 } 66 else 67 { 68 temp=p[j][m-1]-p[j][m-2]-p[i-1][m-1]+p[i-1][m-2]; 69 } 70 for(int k=m-2;k>=0;k--) 71 { 72 if(temp<0) 73 temp=0; 74 if(i==0) 75 { 76 if(k==0) 77 temp+=p[j][k]; 78 else 79 temp+=p[j][k]-p[j][k-1]; 80 } 81 else 82 { 83 if(k==0) 84 temp+=p[j][k]-p[i-1][k]; 85 else 86 temp+=p[j][k]-p[j][k-1]-p[i-1][k]+p[i-1][k-1]; 87 } 88 if(ans<temp) 89 ans=temp; 90 } 91 } 92 } 93 } 94 return ans; 95 } 96 97 int main() 98 { 99 int n,m,temp; 100 int a1,a2; 101 int k=0; 102 printf("请输入二维数组的行数和列数:\n"); 103 scanf("%d %d",&n,&m); 104 int i,j; 105 int **a=new int*[n]; 106 printf("请输入%d*%d个二维数组元素:\n",n,m); 107 for(i=0;i<n;i++) 108 { 109 a[i]=new int[m]; 110 111 for(j=0;j<m;j++) 112 { 113 scanf("%d",&a[i][j]); 114 } 115 } 116 int ans=maxSubArray(a,n,m); 117 printf("二维数组的最大子数组之和是:%d\n",ans); 118 for(a2=0;a2<m-1;a2++) 119 { for(i=0;i<n;i++) 120 { temp=a[i][0]; 121 for(j=1;j<m;j++) 122 {a[i][j-1]=a[i][j];} 123 a[i][m-1]=temp; 124 } 125 126 for(i=0;i<n;i++) 127 { 128 for(j=0;j<m;j++) 129 { 130 131 if(k%m==0) 132 {cout<<endl;} 133 cout<<a[i][j]<<" "; 134 k++; 135 } 136 137 } 138 139 a1=maxSubArray(a,n,m); 140 printf("二维数组的最大子数组之和是:%d\n",a1); 141 } 142 return 0; 143 }
程序运行截图:
总结感受:
在程序设计之前应该与之前的环状一位数组相联系,我们使用了相同的方法解决了问题。同样的由最后一列移到第一列,前面几列依次向后移,有n列就移n-1次,求出n个矩阵的最大子数组,进而在算出环状二维数组的最大子数组。
转载于:https://www.cnblogs.com/cainiao1hao/p/4397394.html
环状二维数组最大子数组求和相关推荐
- 编程之美2.15 二维数组最大子数组的和(数组下标从(1,1)开始)
首先,我们看到这篇文章的题目,我们就会想到之前的那个题目 -- 连续子数组最大和问题.这个问题无疑就是把原问题扩展到二维的情况. 想起来这个问题也不是很难,我们可以求解一维矩阵 ...
- 求一个二维整数数组最大子数组之和,时间复杂度为N^2
本随笔只由于时间原因,我就只写写思想了 二维数组最大子数组之和,可以 引用 一维最大子数组之和 的思想 一维最大子数组之和 的思想,在本博客上有,这里就不做多的介绍了 我们有一个最初的二维数组 ...
- 返回一个二维整数数组最大子数组的和
要求: 1,输入一个二维整形数组,数组里有正数也有负数. 2,二维数组中连续的一个子矩阵组成一个子数组,每个子数组都有一个和, 3,求所有子数组的和的最大值. 设计思路: 参照一维整数数组求解最大子 ...
- 二维数组最大子数组和
一.实验题目 求一个二维数组中和最大的子数组. 二.实验思路 基于我们第一次合作时求的一位数组最大子数组,加上一层循环来遍历二维数组中的所有子矩阵的情况. 第一步:先利用上次的方法求每一行的情况,将每 ...
- HDU2642(二维的树状数组)
二维的树状数组,我记得是模版!^ _ ^ 题意很清楚:就是这部分的原理:sum(x1,y1)+sum(x2-1,y2-1)-sum(x1,y2-1)-sum(x2-1,y1);其实可以和概率论中的一个 ...
- 间接通过new 来申请一个二维的堆内存数组
我们知道无法直接通过new 来申请一个二维的堆内存数组,于是有人想出了这样一个办法:创建一个一维堆内存指针数组,即每个数组元素是一个指针,然后用new 给各个指针分配一个一维的堆内存数组,那么最后表示 ...
- 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- ...
- 关于图的二维矩阵转为一维数组的理解。
一开始看二维矩阵转为一维数组的时候还是有点懵的,为啥是N(N+1)/2呢,为啥不是N*N/2呢,这个矩阵明明是N*N的一个正方形啊,我要省一半空间直接除2不就行了,带着这个问题我观察了一下这个PPT里 ...
- 结对开发——一维数组最大子数组判断溢出
一 题目 求一维数组最大子数组和 要求:1000个数以上,整数 二.设计思路 最大子数组很好找到,但是子数组和的溢出问题很难解决. 经过不断的思考,我得出了结论: 溢出是程程序设计者设计时的不足所带来 ...
最新文章
- 微信小程序 时间操作
- hook虚表监控虚表
- 网络模块优化方案(1)——封装网络框架
- sqlplus命令行登录oracle数据库的N种方法盘点
- perl大骆驼和小骆驼_骆驼路线的主/从故障转移
- 【报告分享】2021年微信视频号半年度生态趋势调查报告.pdf(附下载链接)
- linux 分配组命令,linux下一个用户如何分配给多个用户组?求命令,谢了。
- 2018年中国财富管理才真正迎来发展元年
- 深度优先搜索 - 最短路径
- 阿里巴巴国际站关键字抓取工具
- JUCE学习笔记06-音频输出基础(正弦波)
- Java参数校验工具validation
- mysql 4 字节存储问题_关于mysql存储过程存储4字节emoj的'\xF0\x9F\x98\x82' for column ``.``.`p_topicname`问题的解决办法...
- C#_打包发布变成一个绿色版本软件——Costura.Fody合并DLL和EXE
- 策略模式(策略设计模式)详解
- Jmeter解决上传附件中文名乱码问题
- EXCEL 单元格内换行内容改成两行单元格内容
- 基于javaweb(jsp+jdbc+mysql)的仓库出入库系统毕业设计
- flowable实战(二)flowable流程模型管理接口
- select、poll、epoll的文件描述符上限问题