最大子矩阵【最大连续子串和的衍生】
来源:互联网 发布:阿里云虚拟主机伪静态 编辑:程序博客网 时间:2024/05/10 11:52
最大和
- 描述
给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
例子:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
其最大子矩阵为:9 2
-4 1
-1 8
其元素总和为15。- 输入
- 第一行输入一个整数n(0<n<=100),表示有n组测试数据;
每组测试数据:
第一行有两个的整数r,c(0<r,c<=100),r、c分别代表矩阵的行和列;
随后有r行,每行有c个整数; - 输出
- 输出矩阵的最大子矩阵的元素之和。
- 样例输入
1 4 4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
- 样例输出
15
最大子矩阵和问题
问题描述:给定一个m行n 列的整数矩阵a,试求矩阵a 的一个子矩阵,使其各元素之和为最大。
分析:用2 维数组a[1 : m][1 : n]表示给定的m行n列的整数矩阵。子数组a[i1 : i2][j1 : j2]表示左上角和右下角行列坐标分别为(i1, j1)和(i2, j2)的子矩阵,其各元素之和记为:
(1)
最大子矩阵和问题的最优解即为:
(2)
(3)
如果令:
那么
(4)
式(4)就是我们熟悉的最大子序列和的问题。
根据以上分析我们可得到最大子矩阵和问题的算法:
Max_Sub_Matrix(m, n, a) //m为行数,n为列数,a为二维矩阵
- sum ← 0
- b[n]
- for i←1 to m
- for t←1 to n
- do b[t] = 0 //初始化数组b
- for j←i to m
- do for k←1 to n
- b[k] ← b[k] + a[j][k]
- max←Max_Sub_List(n, b) //函数返回n个数的序列b的最大子序列的和
- if max > sum then sum = max
- return sum
下面我们就通过来同学上课提出的一些特殊情况来检验算法的正确性。
1
2
3
1
-2
10
20
2
100
-1
-2
3
0
-2
-3
矩阵a的行m=3,列数n=3,矩阵的元素分布如上图所示。
当i = 1时,初始化数组b,使得
b:
0
0
0
当j = 1时,k从1递增到n,由算法的第8行可得数组b将首先存储矩阵的第一行的各值,即b为:
b:
-2
10
20
由最大子序列和的函数Max_Sub_List返回该序列的最大子序列的和值为max=30;
当j = 2时,k 从1递增到n,由算法的第8行可得数组b将矩阵a第二行的值分别加到原有各值上,可得数组b为
b:
98
9
18
同理,由函数Max_Sub_List返回该序列的最大子序列的和值为max=125。
当j = 3时,k从1递增到n,由算法的第8行可得数组b将矩阵a第三行的值分别加到原有各值上,可得数组b为
b:
98
7
15
同理,由函数Max_Sub_List返回该序列的最大子序列的和值为max=120。
到此,i的第一次循环结束。
当i = 2时,从新初始化数组b,使得
b:
0
0
0
j = 2时,k从1递增到n,由算法的第8行可得数组b将首先存储矩阵的第二行的各值,即b为:
b:
100
-1
-2
由函数Max_Sub_List返回该序列的最大子序列的和值为max=100。
j = 3时,k从1递增到n,由算法的第8行可得数组b将矩阵a第三行的值分别加到原有各值上,可得数组b为
b:
100
-3
-5
由函数Max_Sub_List返回该序列的最大子序列的和值为max=92。
到此,i的第二次循环结束。
当i=3循环结束时,可求出该矩阵的最大子矩阵和值为125。
算法的第7到第9行求出每行i固定,j变化的最大子序列和的最大值,第6行为可能与第i行一起构成子矩阵的行,将其值对应加到第i行,然后求该子序列的最大值。而最外层的循环为分别求出每一行的子序列最大值。
说明:最大子序列的解法大家可根据上课介绍的方法使用动态规划法来构造。而大家在网上看到的解法一般不能处理(-1,-2,-3),类似于这种所有元素均为负值的序列,而且也不能够方便的处理返回最小个数的位置。
- 最大子矩阵【最大连续子串和的衍生】
- 最大连续子串&子矩阵
- ZOJ1074 最大和子矩阵 DP最大连续子序列
- 【算法小总结】最大连续子序列和最大连续子矩阵的关系与实现
- 最大连续子序列和最大连续子矩阵的关系与实现
- NYOJ 44 & 104 - 最大连续子串和(矩阵最大子矩阵和)
- POJ 1050 最大连续子矩阵和
- 最长连续和与最大子矩阵
- UVa108 UVa10827 最大连续子矩阵和
- XXX-笔试最大连续子矩阵和
- 51nod1051-衍生最大子段和&枚举-最大子矩阵和
- 最大连续子串和
- 最大和连续子串
- 和最大连续子串的问题
- 和最大的连续子串
- 最大子矩阵:二维数组的最大连续子数组和
- Maximum Sum 最大子矩阵和+dp+(最大连续子序列的变形)
- 最大连续子段和+最大矩阵和
- 嵌入式 Linux C如何打印64bit的longlong整型int64_t
- C语言中常用数据类型所占字节数
- 名词解释
- Android动画效果 translate、scale、alpha、rotate 切换Activity动画 控件位置调整
- 《三字经》全文解读
- 最大子矩阵【最大连续子串和的衍生】
- boost::asio 定时器
- Android中的Handler机制
- 整型与字符型相加
- 百度百科(http://baike.baidu.com/ )中“RSA”、“数字签名”、“公钥”、“DES”等4个名词的解释。理解 公钥加密 与 数字签名 之间的联系与区别,能够用自己的话阐述两者的概
- SD卡初始化及读写流程
- 第2周 判断质数
- 小布老师-PL_SQL(第五讲)
- [OpenStack UT] 分析OpenStack中单元测试之mock & mox