题目:给你一个m×n的整数矩阵,在上面找一个x×y的子矩阵,使子矩阵中所有元素的和最大。

题解:dp表示从(1,1)到(i,j)的这个矩阵的和,转移方程dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + a[i][j];

求x*y矩阵的和,转移方程maxx = max(maxx, dp[i][j] - dp[i-x][j] - dp[i][j-y] + dp[i-x][j-y]);

 

 

#include <stdio.h>
#include <string.h>
#include <iostream>

using namespace std;

int dp[1000][1000], a[1000][1000];

int main()
{
int i, j, n, m, x, y;
scanf("%d%d%d%d", &n, &m, &x, &y);
memset(dp, 0, sizeof(dp));
for(i = 1; i <= n; i++)
for(j = 1; j <= m; j++)
scanf("%d", &a[i][j]);
int maxx = 0;
for(i = 1; i <= n; i++)
{
for(j = 1; j <= m; j++)
{
dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + a[i][j];
if(i >= x && j >= y)
{
maxx = max(maxx, dp[i][j] - dp[i-x][j] - dp[i][j-y] + dp[i-x][j-y]);
}
}
}
printf("%d\n", maxx);
return 0;
}