遞推求高維字首和
阿新 • • 發佈:2022-03-31
在求高維字首和時,容斥定理會變得很複雜,所以我們需要使用一種簡便的方式來計算,這裡來介紹一種遞推的方式。
不妨設我們的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可以使用類似於進位制的方法來儲存。