题目:从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

软工随堂练 找出和值最大的子矩阵 尹亚男 赵静娜相关推荐

  1. 软工随堂练 找出和值最小的子数组 尹亚男 赵静娜

    #include <iostream.h> void main() {int a[10]={-3,-1,-1,0,-1,5,4,-1,3,-1},sum[10][10];//sum[i][ ...

  2. 三个变量中怎么找出中间值_一文理解神经网络中的偏差和方差

    在深度学习中,数据过拟合,欠拟合的问题很常见,先总结一下:过拟合称为高方差,欠拟合称为高偏差. 可能只看偏差,方差不是很理解,下面先来个百度百科看一下. 偏差(统计学概念) 偏差又称为表观误差,是指个 ...

  3. java 穷举 排列组合,JavaScript递归穷举所有排列组合并找出重复值

    null export default { data() { return { resultArr:[] } }, mounted(){ this.sss('aaba','abac'); this.s ...

  4. hdu Caocao's Bridges(无向图边双连通分量,找出权值最小的桥)

    1 /* 2 题意:给出一个无向图,去掉一条权值最小边,使这个无向图不再连同! 3 4 tm太坑了... 5 1,如果这个无向图开始就是一个非连通图,直接输出0 6 2,重边(两个节点存在多条边, 权 ...

  5. Excel(WPS部分功能不适用)技巧:快速找出重复值

    筛选出下两列的重复名字(重复名字可能没在一行) 步骤: (1)选中两列,点击条件格式--突出显示单元格规则--重复值 结果:

  6. 第二版:JAVA对象对比VO对象找出差异值结合swagger-ApiModel无需自定义注解

    创建历史记录表存全量 变更前后数据 CREATE TABLE `ltx_change_info` (`ID` varchar(60) NOT NULL COMMENT '主键',`CHANGE_MSG ...

  7. 三个变量中怎么找出中间值_scratch图形化编程基础练习-变量交换

    各位网友大家好,关于变量交换的问题是学习编程的一个必然过程.不论是大学学习C/C++还是其他程序语言对于大多数初学者来说都经历过这样的过程.在电脑世界里面,一个变量就好比一个盘子只能放一个苹果,另一个 ...

  8. python找出函数最小值极其对应的自变量的值

    定义z=x2+y2,x,y的范围都是(-10,10),且为整数,要求找出z的最小值极其对应的x,y值 从等式看出,z最小为0,x,y都等于0 def optimize(): #定义最优化函数 #建空列 ...

  9. 数组排序并找出元素索引--Where do I belong-FCC

    数组排序并找出元素索引 先给数组排序,然后找到指定的值在数组的位置,最后返回位置对应的索引. 举例:where([1,2,3,4], 1.5) 应该返回 1.因为1.5插入到数组[1,2,3,4]后变 ...

最新文章

  1. 家居建材企业信息化管理路在何方?
  2. [YTU]_2498 (C++类实现最大数的输出)
  3. Linux设置SSH登录(SecureCrt)
  4. 7 个习惯帮你提升Python运行性能
  5. centos 修改语言、时区
  6. 小米5安卓使用微信X5 Blink内核调试
  7. Buffers, windows, and tabs
  8. %02 java_02_Java语法
  9. 一、docker临时记录
  10. 一张图看懂字节跳动8年创业史,太励志了吧
  11. java TreeSet去重与排序入门
  12. php pacs,PACS系统
  13. Oracle中登录OEM口令忘记,oracle oem创建过程 一直提示sys密码错误
  14. usb转rj45 android,USB转RJ45驱动合集
  15. 美元符号在什么计算机语言,美元符号是什么?怎么打?
  16. 智邦科技亮相2019 ODCC峰会,为开放网络提供弹性解决方案
  17. [附源码]java毕业设计学校缴费系统
  18. 「win工具」Win 上好用的效率神器Wox
  19. ccf化学方程式配平检验
  20. kettle转换中使用javascript例子整理(2)

热门文章

  1. 安装卡主_智能温室四周玻璃的安装学问还这么多
  2. STM32F1笔记(七)WWDG窗口看门狗
  3. Windows Hook(1)加载DLL
  4. python图例位置_Python | 图例位置
  5. javascript写入_如何在JavaScript中写入HTML元素?
  6. c语言double root,C语言修仙
  7. 一步一步学pwntools(适合新手)
  8. 237. 删除链表中的节点 golang
  9. Redis运维和开发学习笔记(3)redis搭建集群
  10. oracle安装显示注册表,windows下oracle 11g r2 安装过程与卸载详细图解