题目:
给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。
题目数据保证总会存在一个数值和不超过 k 的矩形区域。
示例 1:
输入:matrix = [[1,0,1],[0,-2,3]], k = 2
输出:2
解释:蓝色边框圈出来的矩形区域 [[0, 1], [-2, 3]] 的数值和是 2,且 2 是不超过 k 的最大数字(k = 2
示例 2:
输入:matrix = [[2,2,-1]], k = 3
输出:3
作者dp的结果:
解析:
看到本题是在求小于K的最大和…本能的想到了dp(其实是因为最近一直在学dp)
第一步:首先假设k的值大于整个矩阵之和,也就是说把整个矩阵看作一个矩形,返回的max值就是整个矩阵所有元素值之和;
然后进行回溯递推
请思考一下,如果最大矩阵的和不满足条件,大于k或者不是sum值最大的矩阵,那么最大矩阵m*n的缩小后的第一步的矩阵是什么样子的
答案有两种可能,一种是变成(m-1)*n大小的矩阵,另一种是变成m*(n-1)大小的矩阵
不理解的话举个例子:
mn是一个3*3的矩阵,它是否可以看作一个3*2的矩阵加上一个2*3的矩阵,减去中间的2*2矩阵的部分,再加上(3,3)处的元素,可以试着在纸上画一下,画出来就明白了,相信我:)
作者在黑板上勾勾画画的思路:
画完就明白了,真的,思考下矩阵怎么变的就懂了
然后,通过这两种方法,反推回最大矩阵m*n,就可以得到dp的状态转移方程
dp[m][n] =dp[m-1][n]+dp[m][n-1]-dp[m-1][n-1]+matrix[m][n]
求出转移方程之后,剩下的地方就很简单了,只需要存储每次递推时矩阵数值和的最大值就可以了
下面上代码(java)
class Solution