递推求高维前缀和

在求高维前缀和时,容斥定理会变得很复杂,所以我们需要使用一种简便的方式来计算,这里来介绍一种递推的方式。

不妨设我们的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可以使用类似于进制的方法来保存,实现一一映射,和不同维度下所取的最大值有关。

posted @ 2022-03-31 16:39  y61329697  阅读(42)  评论(0)    收藏  举报