题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1559
题意:求一个m*n矩阵内x*y大小的子矩阵最大值
题解:这题简直so easy啊 这题就是将来一个东西,叫容斥原理。
他俩占的面积怎么求?很简单,两个圆的面积和-两圆相交部分面积
小蓝面积怎么求?整个体积-小绿-小红+小绿小红相交的地方
回到这个题。记a[i,j]为从1-i,1-j的数之和,则我们可以通过容斥定理求出任意一个矩型所有数的和。
#include <bits/stdc++.h>
using namespace std;
int a[1005][1005];
int main(int argc, char const *argv[])
{
int t;
cin >> t;
while(t--) {
memset(a,0,sizeof(a));
int m,n,x,y;
int ans = 0;
cin >> m >> n >> x >> y;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
cin >> a[i][j];
a[i][j] += a[i-1][j]+a[i][j-1]-a[i-1][j-1];
if(i >= x && j >= y) {
ans = max(ans, a[i][j]-a[i-x][j]-a[i][j-y]+a[i-x][j-y]);
}
}
}
cout << ans << endl;
}
return 0;
}