Maximum Sum Rectangular Submatrix in Matrix dynamic programming/2D kadane

本文是对 Maximum Sum Rectangular Submatrix in Matrix dynamic programming/2D kadane 的转述与理解
给定一个矩阵,找出某个子矩阵,使该子矩阵中元素之和最大
所给矩阵如下图,并初始化maxSum = 0, curaccumulateSum表示当前各行累加的值

第一轮,L和R均从第0列开始遍历,当前累加值为[2, 0, 2, -3],运用Kadane Algorithm(是一个非常基本的DP,找出给定一维数组中,最大的和)得到curSum=4(此时对应Up=0, Down=2),比maxSum大,因此更新maxSum=curSum,maxLeft=L=0、maxRight=R=0、maxUp=0,maxDown=2
11
第二轮,L不变,R往后移动一位
则当前累加值为[3, 6, 0, 0],得到curSum=9(此时对应Up=0, Down=1),比maxSum大,因此更新maxSum=curSum,maxLeft=L=0、maxRight=R=1、maxUp=0,maxDown=1
22
第三轮,再将R往右移动一位
当前累加值[0, 9, -1, 1],curSum=9,并未比maxSum大,因此不更新
33
第四轮,R右移一位
当前累加值变为:[-4,13, 3, 1],curSum=17,大于maxSum,更新五个参数
44
第五轮,R右移,累加值为[1, 14, -2, 4],curSum=15<maxSum,不更新

这样整个一大轮遍历结束,开始第二个大轮,从L=1,R=L=1开始
此时累加值也重置,变为[1, 6, -2, 3], curSum=8<maxSum, 不更新
55
R右移一位,累加值=[-2, 9, -3, 4], curSum=10<maxSum, 不更新
66
这样两轮循环结束,即可求得最大子矩阵和,以及其对应的L、R、U、D
用程序语言简略表示即为:

int maxSum = INT_MIN;
for(unsigned L = 0; L < m; ++L)
    for(unsigned R = L; R < m; ++R)
    {
        for(unsigned i = 0; i < n; ++i)
        {
            accumulate[i] += matrix[i][R];
            // do kadane algorithm
            if(curSum > maxSum)
            {
                // do update
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值