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

浙公网安备 33010602011771号