详解 前缀和《倔强青铜———打怪升级章》

详解 前缀和 《倔强青铜——打怪升级章》

如果来看这个Blog的,应该都对(前缀和这个概念很模糊吧)(巨佬到左上角,点那个退出的箭头谢谢
前缀和就是一个重要的预处理,能大大的降低时间复杂度。,很难理解对吧,那就这么记“求前N(i)项的的和”.
举个栗子:
Free Pascal 代码:

a[0]:=0;
for i:=1 to n do
begin
	read(a[i]);
	a[i]:=a[i]+a[i-1];
end;

C++代码:

a[0]=0;
for (int i=1;i<=n;i++)
{
	scanf("%d",&a[i]);
	a[i]:=a[i]+a[i-1];
}

如果输出a[n],就会输出n的累加。

以上就是基础用法(核心代码 )!

来到例(水)题练练手吧:

有 N 个的正整数放到数组 A 里,现在要求一个新的数组 B,新数组的第 i 个数 B[i]是原数组 A 第 1 到第 i 个数的和。求B的第t个数.
样例输入:
3->n
2 3 1->a[i]
3->t
样例输出:
6

这道题很明显,B数组的第i位=A数组的第1位~第i位的,
所以对于这道题,我们有两种做法:

  • 把对数组 A 的累加依次放入数组 B 中。(对A数组做前缀和,保存在Bs数组中)
  • 递推: B[i] = B[i-1] + A[i] ,前提 B[0] = A[0] 。
  • FreePascal参考程序:
var
        n,i,t:longint;
        a,b:array[0..1000005] of int64;
begin
        readln(n);
        a[0]:=0;
        for i:=1 to n do
        begin
                read(a[i]);
                a[i]:=a[i]+a[i-1];
                b[i]:=a[i];
        end;
        readln(t);
        writeln(b[t]);
end.

  • C++参考程序:(巨佬们如果追求速度,可以自行改快读 )
#include 

using namespace std;

int N, A[10000], B[10000],t;
int main() {
  cin >> N;
  for (int i = 0; i < N; i++) {
    cin >> A[i];
  }
  B[0] = A[0];
  for (int i = 1; i < N; i++) {
    B[i] = B[i - 1] + A[i];
  }
  cin >> t;
  cout << b[t];
  
  return 0;
}

首先, B[0] = A[0]; ,前缀和数组的第一项和原数组的第一项是相等的。

B[i] = B[i-1] + A[i] 意思就是:前缀和数组的第 i 项 = 原数组的 0 到 i-1 项的和 + 原数组的第 i 项。

小怪已刷完……
送一道经典例题洛谷U53525 前缀和(例题)
附上ACPascal代码:

var
        n,i:longint;
        a,b:array[0..1000005] of int64;
begin
        readln(n);
        a[0]:=0;
        for i:=1 to n do
        begin
                read(a[i]);
                a[i]:=a[i]+a[i-1];
                b[i]:=a[i];
        end;
        for i:=1 to n do
        begin
                write(b[i],' ');
        end;
end.

怎么感觉没什么用呀?一开始看不出来,那就看下一期吧!全是干活哟。

下一章《详解 前缀和《秩序白银———修炼成仙章》》

本章终!(记得要看下一章(^U^)ノ~YO)

你可能感兴趣的:(算法,java,c++,动态规划,图论)