洛谷 P1719 最大加权矩形 题解

P1719 最大加权矩形 题解

题目

题目传送门

题解

思路

这题是一道二维前缀和的经典题目(可以说是模板题了)。

使用数组\(s\)表示数组\(a\)的二维前缀和,\(s_{i,j}\)表示\(a_{1,1}\)\(a_{i,j}\)的和。需要求\(a_{i,j}\)\(a_{k,l}\)的和可以使用\(s_{k,l}-s_{i-1,l}-s_{k,j-1}+s_{a-1,b-1}\)

随后使用四重循环枚举\(i,j,k,l\),利用上述公式一一算出并记录最大值即可。

代码

#include<bits/stdc++.h>
#define endl '\n'
#define INF 0x7fffffff
#define EPS 1e-8
using namespace std;
int n,a[125][125],q[125][125];
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
			q[i][j]=q[i-1][j]+q[i][j-1]-q[i-1][j-1]+a[i][j];
		}
	}
	long long mx=LLONG_MIN;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			for(int k=1;k<=n;k++){
				for(int l=1;l<=n;l++){
					if(i==k&&j==l) continue;
					if(i>k||j>l) continue;
					long long s=q[k][l]-q[i-1][l]-q[k][j-1]+q[i-1][j-1];
					mx=max(mx,s);
				}
			}
		}
	}
	cout<<mx<<endl;
	return 0;
}
posted @ 2025-02-09 16:26  2789617221guo  阅读(60)  评论(0)    收藏  举报