字首和&二維字首和
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
原理就是:所有有顏色的減去上面一條紅的,再減去左邊一條紅的,再減去左上角那個小的紅方塊