SOS_dp算法
Codeforces博客
簡介:
前置知識:狀壓dp
Sum over Subsets dynamic programming,簡稱Sos dp,狀壓dp的一種
用一個列題引出SOS dp:
給你一個由2N2^N2N個整數(shù)組成的確定數(shù)組A,我們需要計算對于任意的x,F(x)=所有A[i]的和sumF(x)=所有A[i]的和sumF(x)=所有A[i]的和sum且x&i=i,i是x的子集
整理成公式就是:
F[mask]=∑i∈maskA[i]F[mask]=\sum_{i∈mask}A[i]F[mask]=i∈mask∑?A[i]
i∈mask就是&mask=i
F[mask]里面包含了mask所有二進制子集的信息
復(fù)雜度為O(n?log(n))O(n*log(n))O(n?log(n))
dp[mask][i]dp[mask][i]dp[mask][i] 表示 x&mask=x,x∧mask<2i+1x\&mask=x,x^{\land}mask<2^{i+1}x&mask=x,x∧mask<2i+1的A[x]的和
也就是dp[mask][i]是和mask只有前i個位(最靠右的i位)不同的A[x]的和
轉(zhuǎn)移方程有:
如圖:
可以理解為:每次我求解一個狀態(tài)時,只從他的所有子集里和他只差一位的狀態(tài)轉(zhuǎn)移過來
代碼:
擴展應(yīng)用:
CF1208F
CF165E
CF383E
Covering Sets CodeChef - COVERING
CF449D
CF800D
總結(jié)
- 上一篇: 什么是Q盘,Q盘使用方法
- 下一篇: CF1208F Bits And Pie