软工随堂练 找出和值最大的子矩阵 尹亚男 赵静娜
题目:从m*n矩阵中找出元素和最大的子矩阵。
分析:此题是可看做节课求和值最大子数组的一种延伸。但如果按之前的枚举法显然太过麻烦,复杂度为O(n^4)。那么有没有更好的方法呢?
我们拿出上一道题做了进一步的商讨。找了一些网上的思路得到了如下方法:
1 #include <iostream.h> 2 maxSubarray(int n,int a[]) 3 { 4 int b=0,sum=-100000; 5 for(int i=0;i<n;i++) 6 { 7 if(b>0) b+=a[i]; 8 else b=a[i]; 9 if(b>sum) sum=b; 10 } 11 return sum; 12 } 13 int main() 14 { 15 int a[]={-1,3,4,-6,5,3,7,-9,10,0}; 16 cout<<maxSubarray(10,a)<<endl; 17 }
此算法的原理是,按序一个个相加,正数越加越大,每得到一个正数更新一次sum;而负数越加越小,当和值为负时,放弃前面的数,更新b,寻找新一轮的正数最大和b,当大于前面的sum时赋给sum。for循环执行一遍,将最大值在b,sum之间动态传递和更新,时间复杂度O(n),与之前的穷举法相比无疑是一种高效的算法。
那么由此延伸到二维数组中,求矩阵的最大子矩阵和,我们得到如下算法:
1 #include <iostream.h> 2 int maxSubArray(int n,int a[]) 3 { 4 int b=0,sum=-10000000; 5 for(int i=0;i<n;i++) 6 { 7 if(b>0) b+=a[i]; 8 else b=a[i]; 9 if(b>sum) sum=b; 10 } 11 return sum; 12 } 13 int maxSub(int n,int array[][10]) 14 { 15 int i,j,k,max=0,sum=-100000000; 16 int b[10]; 17 for(i=0;i<n;i++) 18 { 19 for(k=0;k<n;k++)//初始化b[] 20 { 21 b[k]=0; 22 } 23 for(j=i;j<n;j++)//把第i行到第j行相加,对每一次相加求出最大值 24 { 25 for(k=0;k<n;k++) 26 { 27 b[k]+=array[j][k]; 28 } 29 max=maxSubArray(k,b); 30 if(max>sum) 31 { 32 sum=max; 33 } 34 } 35 } 36 return sum; 37 } 38 void main() 39 { 40 int n,array[10][10]; 41 cout<<"输入矩阵行列数"; 42 cin>>n; 43 cout<<"\n输入矩阵"<<endl; 44 for(int i=0;i<n;i++) 45 { 46 for(int j=0;j<n;j++) 47 { 48 cin>>array[i][j]; 49 } 50 } 51 cout<<"子矩阵元素和最大为"<<maxSub(n,array)<<endl; 52 }
转载于:https://www.cnblogs.com/candy-yyn/p/3627067.html
软工随堂练 找出和值最大的子矩阵 尹亚男 赵静娜相关推荐
- 软工随堂练 找出和值最小的子数组 尹亚男 赵静娜
#include <iostream.h> void main() {int a[10]={-3,-1,-1,0,-1,5,4,-1,3,-1},sum[10][10];//sum[i][ ...
- 三个变量中怎么找出中间值_一文理解神经网络中的偏差和方差
在深度学习中,数据过拟合,欠拟合的问题很常见,先总结一下:过拟合称为高方差,欠拟合称为高偏差. 可能只看偏差,方差不是很理解,下面先来个百度百科看一下. 偏差(统计学概念) 偏差又称为表观误差,是指个 ...
- java 穷举 排列组合,JavaScript递归穷举所有排列组合并找出重复值
null export default { data() { return { resultArr:[] } }, mounted(){ this.sss('aaba','abac'); this.s ...
- hdu Caocao's Bridges(无向图边双连通分量,找出权值最小的桥)
1 /* 2 题意:给出一个无向图,去掉一条权值最小边,使这个无向图不再连同! 3 4 tm太坑了... 5 1,如果这个无向图开始就是一个非连通图,直接输出0 6 2,重边(两个节点存在多条边, 权 ...
- Excel(WPS部分功能不适用)技巧:快速找出重复值
筛选出下两列的重复名字(重复名字可能没在一行) 步骤: (1)选中两列,点击条件格式--突出显示单元格规则--重复值 结果:
- 第二版:JAVA对象对比VO对象找出差异值结合swagger-ApiModel无需自定义注解
创建历史记录表存全量 变更前后数据 CREATE TABLE `ltx_change_info` (`ID` varchar(60) NOT NULL COMMENT '主键',`CHANGE_MSG ...
- 三个变量中怎么找出中间值_scratch图形化编程基础练习-变量交换
各位网友大家好,关于变量交换的问题是学习编程的一个必然过程.不论是大学学习C/C++还是其他程序语言对于大多数初学者来说都经历过这样的过程.在电脑世界里面,一个变量就好比一个盘子只能放一个苹果,另一个 ...
- python找出函数最小值极其对应的自变量的值
定义z=x2+y2,x,y的范围都是(-10,10),且为整数,要求找出z的最小值极其对应的x,y值 从等式看出,z最小为0,x,y都等于0 def optimize(): #定义最优化函数 #建空列 ...
- 数组排序并找出元素索引--Where do I belong-FCC
数组排序并找出元素索引 先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引. 举例:where([1,2,3,4], 1.5) 应该返回 1.因为1.5插入到数组[1,2,3,4]后变 ...
最新文章
- 家居建材企业信息化管理路在何方?
- [YTU]_2498 (C++类实现最大数的输出)
- Linux设置SSH登录(SecureCrt)
- 7 个习惯帮你提升Python运行性能
- centos 修改语言、时区
- 小米5安卓使用微信X5 Blink内核调试
- Buffers, windows, and tabs
- %02 java_02_Java语法
- 一、docker临时记录
- 一张图看懂字节跳动8年创业史,太励志了吧
- java TreeSet去重与排序入门
- php pacs,PACS系统
- Oracle中登录OEM口令忘记,oracle oem创建过程 一直提示sys密码错误
- usb转rj45 android,USB转RJ45驱动合集
- 美元符号在什么计算机语言,美元符号是什么?怎么打?
- 智邦科技亮相2019 ODCC峰会,为开放网络提供弹性解决方案
- [附源码]java毕业设计学校缴费系统
- 「win工具」Win 上好用的效率神器Wox
- ccf化学方程式配平检验
- kettle转换中使用javascript例子整理(2)
热门文章
- 安装卡主_智能温室四周玻璃的安装学问还这么多
- STM32F1笔记(七)WWDG窗口看门狗
- Windows Hook(1)加载DLL
- python图例位置_Python | 图例位置
- javascript写入_如何在JavaScript中写入HTML元素?
- c语言double root,C语言修仙
- 一步一步学pwntools(适合新手)
- 237. 删除链表中的节点 golang
- Redis运维和开发学习笔记(3)redis搭建集群
- oracle安装显示注册表,windows下oracle 11g r2 安装过程与卸载详细图解