1. 程式人生 > 其它 >遞推求高維字首和

遞推求高維字首和

在求高維字首和時,容斥定理會變得很複雜,所以我們需要使用一種簡便的方式來計算,這裡來介紹一種遞推的方式。

不妨設我們的state為<a1,a2,...,an>代表了一個n維空間下的狀態,其中a1為最低維度,an為最高維度。f(state)代表每個具體位置的權值。

為了計算出整體的字首和,我們需要從低維度算起,我們引入一個數組sum[i][state],該陣列代表了高於i維(不包括i維)的狀態值與state完全相同時對字首和的貢獻。

狀態轉移方程為:

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 <= D;i += 1)
  for 以字典序從小到大列舉 state
    sum[state] += sum[state'];

state可以使用類似於進位制的方法來儲存。