(Day4)前缀和&二维前缀和
前缀和&二维前缀和
1. 前缀和
先写了一道前缀和的题目,以前的我这能骗人,其实不太沾边,所以先放一个模板代码在这。
前缀和的原理就是,a[i]的意义是从1~i的数的总和是多少,如果我想
#include<bits/stdc++.h>
using namespace std;
const int N = 10009;
int a[N];//开在外面,初值都是0
int main()
{
int n,x;
cin>>n;
int sum=0;
for(int i=1;i<=n;i++)
{
cin>>x;
sum+=x;
a[i]=sum;//前i位的和
}
//如果我想得到位置在4~9之间的数的和
cout<<a[9]-a[3]<<endl;
return 0;
}
2. 二维前缀和
二维前缀和稍微复杂一点,但也是套模板的
比如说一个二维数组
2 3 4
6 3 2
5 7 3
我想用一个矩形圈出来一些数然后计算和。就用到二维前缀和。
数组:dp[i][j]
表示(1,1)这个点与(i,j)这个点两个点分别为左上角和右下角所组成的矩阵内的数的和
先说怎么预处理吧
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);//输入数组
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+a[i][j];//预处理
}//等于(红+绿)+(红+蓝)-红+深蓝
}
然后就是怎么调用
//调用绿色的区域(以(x1,y1),(x2,y2)为顶点)
int sum=dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1];
//因为数是离散的(单个单个的),不实际包括x1,y1,所以这里x1y1需要-1
原理就是:所有有颜色的减去上面一条红的,再减去左边一条红的,再减去左上角那个小的红方块
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步