本文是对 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
第二轮,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
第三轮,再将R往右移动一位
当前累加值[0, 9, -1, 1],curSum=9,并未比maxSum大,因此不更新
第四轮,R右移一位
当前累加值变为:[-4,13, 3, 1],curSum=17,大于maxSum,更新五个参数
第五轮,R右移,累加值为[1, 14, -2, 4],curSum=15<maxSum,不更新
这样整个一大轮遍历结束,开始第二个大轮,从L=1,R=L=1开始
此时累加值也重置,变为[1, 6, -2, 3], curSum=8<maxSum, 不更新
R右移一位,累加值=[-2, 9, -3, 4], curSum=10<maxSum, 不更新
这样两轮循环结束,即可求得最大子矩阵和,以及其对应的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
}
}
}