前缀和

前缀和:

1. 一维前缀和

公式:

\[f[i]=\sum_{j=0}^ia[j] \]

每个计算都要循环一遍,太麻烦了!还有什么办法?

化简:\(f[i]=a[i]+f[i-1]\)

例题:

给你一个长度为\(n\)数列,问你\(m\)个问题,分别是:第\(b[i]\)个数之前的每一个数相加,和为多少?

先将每一个数算出它的和。

for(int i=1;i<=10001;i++)
{
	f[i]=a[i]+f[i-1];//化简公式
}

再解决询问的问题。

for(int i=1;i<=m;i++)
{
	cin>>b;//输入
	cout<<f[b];
}

2. 二维前缀和

如图,\(f[i][j]=f[i-1][j]+f[i][j-1]\),但是我们多算了绿块\(f[i-1][j-1]\),还少算了红块\(f[i][j]\),只要减掉,再加上,就可以啦 。

\(\texttt{P1147 连续自然数和}\)

\(\texttt{P1387 最大正方形}\)

\(\texttt{P1437 [HNOI2004]敲砖块}\)

posted @ 2020-08-27 16:46  panjoel  阅读(64)  评论(0)    收藏  举报