洛谷P1719 最大加权矩形(二维前缀和)
关于二维前缀和
参考dl博客:二维前缀和简单总结
题意
给出一个N x N的矩阵,计算出矩阵中加权最大的矩阵
输入输出
输入n维矩阵
输出矩阵最大加权和
思路
这是二维前缀的模板题,画图分析,需要用到容斥原理。
#include <iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 150;
int s[N][N],a[N][N];
int ans = -1e9;
int main(){
int n;
cin >> n;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
cin >> a[i][j];
s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j]; //预处理矩阵的前缀和
}
}
for(int x1 = 1;x1 <= n;x1++){
for(int y1 = 1;y1 <= n;y1++){
for(int x2 = x1;x2 <= n;x2++){
for(int y2 = y1;y2 <= n;y2++){
//遍历矩阵,通过容斥原理计算最大加权矩阵
ans = max(ans,s[x2][y2] - s[x2][y1-1] - s[x1-1][y2] + s[x1-1][y1-1]);
}
}
}
}
cout << ans;
return 0;
}