(Day4)字首和&二維字首和

wlqtc發表於2024-06-25

字首和&二維字首和

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

原理就是:所有有顏色的減去上面一條紅的,再減去左邊一條紅的,再減去左上角那個小的紅方塊

相關文章