洛谷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;
}

posted @ 2021-07-19 09:18  inss!w!  阅读(179)  评论(0编辑  收藏  举报