2018 8 1 狀壓 CF482C 題解

2022-05-25 18:30:14 字數 1482 閱讀 6356

noip2016考了一道狀壓dp,一道期望dp

然而這題是狀壓期望dp...

所以難度是什麼,省選noi嗎...

怎麼辦...

題目大意:

給定n個字串,甲從中任選出乙個串(即選出每個串的概率相同為1/n),乙要通過詢問甲選出的字串pos位置上的字元是什麼來確定這個串。然而由於有些字串的一些位置上字元相同,所以可能不能通過一次詢問達成目標。現在乙沒有任何策略地進行隨機詢問,問乙能夠確定答案的詢問次數期望是多少?

其中n<=50,每個字串長度相等且長度<=20

題解:首先狀壓是比較好想的,但是和期望結合起來了,我們怎麼辦呢?

那麼我們先嘗試對詢問進行狀壓,這也是最顯然的乙個思路:記1表示該位置已被詢問過,0表示該位置未被詢問過。

那麼我們考慮轉移:設狀態為dp[i],字串長度為l,那麼dp[i]+=dp[i|(1《看懵了?

首先我們要知道,這是個期望dp,狀態表示的是已經問了i狀態的問題,距離得到想要的字串的期望距離是多少

於是顯然我們從後向前更新。

接下來,我們設j是i狀態中沒問過的乙個問題,那麼dp[i]就可以由dp[i|(1《而設i狀態中沒問過的問題數為tot,那麼問出問題j的概率就是1/tot

但...你有沒有覺得缺點什麼?

是啊,這樣根本忽略掉了字串,變成了無論你讀入什麼串結果都一樣,因為轉移中根本沒體現出字串的存在!!!

所以這個轉移顯然是並不完全的。

那麼我們要考慮一下完善它

我們維護另乙個陣列s,用s[i]表示問i狀態的問題有多少字串是彼此區分不開的

然後在轉移dp時,我們使用這個方程:dp[i]=(∑dp[i|(1《這樣就比較完善了。

至於證明:前半部分不說了,我們就說一下後面除法的部分:

其實這個方程可玄學了,網上其他方程都和這個不一樣,但這是最簡潔的乙個...

稍微證明一下,就是說當狀態為i時,待確定的串有num[i]個,而當狀態為(1《這樣一來,無法確定所求串的概率就是num[(1《至於num陣列如何維護,首先我們記錄某一狀態i下有哪些串不能確定,那麼如果詢問為i的子集這些串顯然也不能確定,那麼我們再把所有的子集查出來維護一下就好了。

#include #include #include #include #include #include #include #include #define ll long long

using namespace std;

int num[(1<<20)+5];

double dp[(1<<20)+5];

ll unusage[(1<<20)+5];

int n,l;

char ch[55][25];

int main()

else

}for(int j=0;jdp[i]+=dp[i|(1<}

dp[i]+=1.0;

} }printf("%.9lf\n",dp[0]);

return 0;

}

CF678E(狀壓DP 期望)

4648.noip2016提高a組模擬7.17 錦標賽 problem n nn個人進行n 1 n 1n 1輪淘汰賽。已知i ii戰勝j jj勝率為ai,ja ai,j 求乙個排列使得1 11獲勝概率最大.n 18 n le 18 n 18 solution 首先考慮乙個暴力做法 如果已經知道了排列...

CF 55D數字dp 狀壓

cf 55d數字dp 狀壓 求出區間 l,r 中的所有beautiful number的數目,如果乙個數x可以被它各個數字上的非零數整除,那它就是beautiful number。很巧妙的一道數字dp,沒想出來看題解了。假設不考慮記憶化搜尋,這裡可以直接列舉每一位的值來進行計算,這裡可以進行狀壓,利...

CF 449D 題解(狀壓 容斥)

狀壓妙啊.本題的主體思路 狀壓 容斥原理 或狀壓 數字dp 記g i 表示按位與後結果所有位上至少有i個1的方案數 那麼根據容斥原理,ans g 0 g 1 g 2 g 3 g 4 於是如果我們求出了g,就可以求出ans 可是怎麼求出g呢 我們記f i 表示a i i這樣的a的個數,那麼如果i某一位...