(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  阅读(19)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示