當前位置:
首頁 >
SOS_dp算法
發布時間:2023/12/3
37
豆豆
Codeforces博客
簡介:
前置知識:狀壓dp
Sum over Subsets dynamic programming,簡稱Sos dp,狀壓dp的一種
用一個列題引出SOS dp:
給你一個由2N2^N2N個整數組成的確定數組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所有二進制子集的信息
復雜度為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]的和
轉移方程有:
如圖:
可以理解為:每次我求解一個狀態時,只從他的所有子集里和他只差一位的狀態轉移過來
代碼:
擴展應用:
CF1208F
CF165E
CF383E
Covering Sets CodeChef - COVERING
CF449D
CF800D
總結
- 上一篇: 什么是Q盘,Q盘使用方法
- 下一篇: CF1208F Bits And Pie