题目链接
思路:dp[i][j] 表示前i行 前j列的 矩阵和
∑ix=1∑jy=1dp[x][y]
那么任意一个矩阵都可以用这种类似前缀和形式的dp数组来表示,维护一个最大的子矩阵即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <sstream>
#include <cmath>
using namespace std;
const int inf =0x3f3f3f3f;
typedef long long LL;
const int MAXN = 1005;
int dp[MAXN][MAXN];
int main()
{
int n, m, x, y;
int t;
scanf("%d", &t);
while(t--)
{
scanf("%d %d %d %d", &n, &m, &x, &y);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&dp[i][j]);
for(int i=0;i<=n;++i)
dp[i][0]=0;
for(int i=0;i<=m;++i)
dp[0][i]=0;
int Max=0;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
dp[i][j]=dp[i][j]+dp[i][j-1]+dp[i-1][j]-dp[i-1][j-1];
if(i>=x&&j>=y)
Max=max(Max, dp[i][j]-dp[i-x][j]-dp[i][j-y]+dp[i-x][j-y]);
}
}
cout<<Max<<endl;
}
return 0;
}