什么是前綴和、前綴積?
前綴和、前綴積也稱前綴和數組,前綴積數組。
給一數組A,
前綴和:新建一數組B,數組中每一項B[i]保存A中[0…i]的和;
后綴和:新建一數組B,數組中每一項B[i]保存A中[i…n-1]的和;
前綴積:新建一數組B,數組中每一項B[i]保存A中[0…i]的積;
后綴積:新建一數組B,數組中每一項B[i]保存A中[i…n-1]的積;
前綴和、前綴積的應用(例子):
1、題目1:
給定浮點數組a,求一數組b,b[i]=a[0]*a[1]*…*a[i-1]*a[i+1]*…*a[n-1],不能使用除法,不允許新開數組。
思路:
先求“后綴積”:
for(int i=n-1;i>=0;i—) b[i]=a[i]*((i==n-1)?1:b[i+1]);
順帶求“前綴積”:
for(int i=0,j=1;i<n;j*=a[i++]) b[i]=j*((i==n-1)?1:b[i+1]);
2、題目2:
求數組中連續一段和,絕對值最小?
思路:
前綴和的性質:a[i]+a[i+1]+…+a[j]=sum[j]-sum[i-1]
前綴和排序,取最小
3、題目3:
把一個數組從中間p位置分開,使得a[0]+…+a[p-1]與a[p]+a[p+1]+…+a[n-1]差值最小?
思路:
- 前綴和-(總和-前綴和)=2*前綴和-總和,是該公式最小;
- 如果都是非負數,可以采取“兩頭掃”的方法,和較小的那邊多加一個數;
