如图,给定一点,要找到这点(包括)左上方的子区域内,使k*k区域所有数字加和最大的矩阵,如图 k=2
对于x,y左上方的子矩阵中的某一k*k
区域,这个区域只能有四种状态:
k*k
区域右边缘落在 (x, y) 正上方,问题转换为求解 (x-1, y) 左上方的最大加和的k*k
区域k*k
区域下边缘落在 (x, y) 正左方,问题转化为求解 (x, y-1) 左上方的最大加和的k*k
区域k*k
区域既不落在 (x, y)正上方,也不在正左方,问题转化为(x-1, y) 或 (x, y-1)
左上方的最大加和的k*k
区域k*k
区域右下角就是 (x, y) ,那么问题可以直接被解
因为状态3包含于1,2之中,我们只需要比较状态124,取最大即可
定义状态:
dp[x][y] 表示【从左上角到x,y坐标】的子矩阵中,和最大的k*k
区域的所有数字加和
状态转移
dp[x][y] = max(以xy为右下角的k*k区域加和, max(dp[x][y-1], dp[x-1][y]))
求解k*k区域所有元素的加和,通过矩阵前缀和,常数时间完成
代码
#include <bits/stdc++.h>