常用的算法---前缀和and差分

前缀和:

是指一个数组的某下标之前的所以数组的元素的和(包括自身,有点类似于高中数学中的数列意思A.1~A.n求S.n 是一个道理。)


一维前缀和:

用于:快速求出数组区间中的和

S.i = a.1+a.2+a.3+a.4+...+a.i

(1)求S[ i ]:

for(int i=1;i

s[i]=s[i-1]+a[i]


举例:

来源洛谷AT_abc037_c

题目描述

長さ N の数列 {ai​} と1 以上 NN 以下の整数 K が与えられます。 この数列には長さ K の連続する部分列が N−K+1 個あります。これらのそれぞれ部分列に含まれる値の合計の総和を求めてください。

输入格式

入力は以下の形式で標準入力から与えられる。

N K a_1 ..aN​

输出格式

部分列に含まれる値の合計N−K+1 個の総和を出力せよ。

题意翻译

输入两个整数n,k; 给出一个长度为N的数列a[1]-a[n].

求这个数列中所有长度为K的连续的部分的总和

感谢 @赫拉克勒斯 提供的翻译。


解答

for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n-k+1;i++)
        for(int j=i;j<=i+k-1;j++)
            ans+=a[j];
二维前缀和:

这是建立于一维前缀和之上的,在一个矩阵中,任意一个子矩阵的和。

(1)S[i][j]:

for(i=1;i<=n;i++){

for(j=1;j

s[i][j]=s[i-1][j]+s[i][j-1]+a[i][j];}}

(2)子矩阵的和:这挺和线性代数里的子矩阵十分相似。

S[x2][y2]-S[x2][y1-1]-S[x1-1][y2]+S[x1-1][y1-1];

你可能感兴趣的:(算法,c语言)