递推求高维前缀和
在求高维前缀和时,容斥定理会变得很复杂,所以我们需要使用一种简便的方式来计算,这里来介绍一种递推的方式。
不妨设我们的state为<a1,a2,...,an>代表了一个n维空间下的状态,其中a1为最低维度,an为最高维度。f(state)代表每个具体位置的权值。
为了计算出整体的前缀和,我们需要从低维度算起,我们引入一个数组sum[i][state],该数组代表了高于i维(不包括i维)的状态值与state完全相同时对前缀和的贡献。更加具体的说法是当后n-i维的值固定时,求前i维的sum和。
状态转移方程为:
sum[i][<a1,a2,..,ai,...,an>]=sum[i-1][<a1,a2,..,ai,...,an>]+sum[i][<a1,a2,..,ai-1,...,an>]。
根据滚动数组,可以压缩为sum[<a1,a2,..,ai,...,an>]=sum[<a1,a2,..,ai,...,an>]+sum[<a1,a2,..,ai-1,...,an>]。由于使用了滚动数组,所以状态值必须从小的到大遍历。
最后我们可以得到一个伪代码:
for state sum[state] = f[state]; for(i = 0;i <= n;i += 1) for 以字典序从小到大枚举 state sum[state] += sum[state'];
state可以使用类似于进制的方法来保存,实现一一映射,和不同维度下所取的最大值有关。

浙公网安备 33010602011771号