动态规划题,设 dp[i][j] 表示从 (1, 1) 开始,i 行,j 列的矩阵元素之和,则 dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + num[i][j]。
每次输入新元素时,计算以该元素为右下角,x 行,y 列的矩阵元素之和,并更新子矩阵最大元素之和。
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1005;
int dp[MAXN][MAXN];
int main()
{
int T;
cin >> T;
while (T--)
{
int m, n, x, y;
cin >> m >> n >> x >> y;
int maxSum = 0; //子矩阵最大元素之和
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> dp[i][j];
dp[i][j] += dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1];
if (i >= x && j >= y) //计算以(i,j)为右下角,x行,y列的矩阵元素之和
maxSum = max(maxSum, dp[i][j] - dp[i - x][j] - dp[i][j - y] + dp[i - x][j - y]);
}
}
cout << maxSum << endl;
}
return 0;
}
继续加油。