動態規劃題,設 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;
}
繼續加油。