CodeForces 482C Game with Strings
題意:
n個長為m的字符串 等概率的藏起來一個串 然後游戲者來猜藏起來的串是什麼 每一步游戲者可以等概率的詢問字符串的一個位置 再不斷的知道一些位置後 游戲者就可以確定藏起來的串是什麼 問 游戲者的期望步數
思路:
可以說是一道概率題 也可以說是期望題 總之感覺題目不錯…
首先如果我們枚舉藏起來的串是哪個(復雜度n) 然後利用狀壓去dp維護猜某些位的狀態的概率 以及對於那個狀態剩下哪些串是無法辨別的(復雜度m*2^m) 那麼復雜度為 O(nm2^m) 這樣就會TLE
接著思考 其實問題不是出在狀壓的2^m上(它已經很優秀了) 既然不去掉狀壓 那麼輔助狀態轉移的m也扔不掉 我們只能想方法避免那個n 使復雜度達到 O(m2^m)
然後我們來確定方案:
我們用狀壓的二進制數表示m個位置有哪些位置已經被揭示了 那麼我們可以利用dp求出對於每個狀態的概率(或者稱為從一位都不揭示到揭示到現在這種狀態的期望) 那麼對於現在這種狀態 如果已經可以猜到藏起來的是哪個串 那麼我們就不需要再猜了 否則至少要猜下一步 那麼這個“下一步”對於整個游戲期望步數的貢獻就為dp[狀態]*1
現在問題就在 如何判斷這個狀態是不是猜完了
其實這個問題可以用dp打表出 對於已經猜了一些位置後 有哪些串是現在的狀態分辨不出來的(代碼中的f數組)
那麼如果f為0 表示已經猜到了 如果不為0則裡面至少有2個1存在 則對於其中的每個1 如果藏起來的正是1對應的那個串 則還需要1步 那麼這1步對答案的貢獻就是剛才說的dp[]*1了
代碼:
#include
#include
#include
#include
#include
#include