(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)这个点两个点分别为左上角和右下角所组成的矩阵内的数的和

先说怎么预处理吧

img

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];//预处理
  }//等于(红+绿)+(红+蓝)-红+深蓝
}

然后就是怎么调用

img

//调用绿色的区域(以(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

原理就是:所有有颜色的减去上面一条红的,再减去左边一条红的,再减去左上角那个小的红方块

posted @   wlqtc  阅读(18)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示