最大加权矩形
洛谷P1719
Hi there! 今天我们继续来看另一道前缀和&差分的题
上一道题可以说是用了一个更简单但是不适用于所有前缀和的题 这次我们来仔细讲一下前缀和
先看题


那么这道题怎么做呢?我们先来看看这个例子:
给你一个二维数组 求红色部分数字之和

其实就是蓝色部分

减去绿色部分

再加上黄色部分 因为重复减了

所以这样的话我们只需
1.在输入的时候用一个二维数组 a[ i ] [ j ] 记录从 i 到 j 的和
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]);
}
2.遍历(一个个找)设置两个点 ( i1, j1 ) & ( i2 , j2 ) 一个个加 最终算出最大矩阵
int maxx=0x80000000;
for (int i1=1;i1<=n;i1++)
for (int j1=1;j1<=n;j1++)
for (int i2=i1;i2<=n;i2++)
for (int j2=j1;j2<=n;j2++)
{
s=a[i2][j2]-a[i1-1][j2]-a[i2][j1-1]+a[i1-1][j1-1]; // 这里就是用代码实现上面讲解的例子🌰
if (s>maxx) maxx=s;
}
所以合起来就是这样的
#include <iostream>
using namespace std;
int a[125][125];
int n,s=0;
int main ()
{
cin >> n;
for (int i=1;i<=n;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]);
}
int maxx=0x80000000;
for (int i1=1;i1<=n;i1++)
for (int j1=1;j1<=n;j1++)
for (int i2=i1;i2<=n;i2++)
for (int j2=j1;j2<=n;j2++)
{
s=a[i2][j2]-a[i1-1][j2]-a[i2][j1-1]+a[i1-1][j1-1];
if (s>maxx) maxx=s;
}
cout << maxx;
return 0;
}
一定要把公式理解透彻啊 千万不要死记硬背 我试过 死得很惨🙂
今天就到这里 Au revoir~
----------------------------------------✂︎---------------------------------------------
此题解已经AC 欢迎指出更多优化方法~
本文介绍了洛谷P1719问题的解决方案,探讨如何利用前缀和来解决最大加权矩形的问题。通过举例说明,解释了如何计算二维数组中特定矩形区域的数字之和,并提出了一种二维数组记录前缀和的方法,以及遍历寻找最大矩阵的思路。作者强调理解公式的重要性,鼓励读者深入理解而非死记硬背。
960

被折叠的 条评论
为什么被折叠?



