dp 好題。
首先,讀完題後,就感覺很不可做,我們可以考慮正難則反,算輸光的機率,這樣可以想出一個暴力狀壓 dp 的做法,但是考場上連狀壓再高消的分都沒給。
我們考慮設計一個巧妙的狀態去描述這個局面,注意,設計狀態的範圍是很廣的。我們發現我們輸光的過程的 \(\max(S)\) 長成一個折線圖,最後歸為 \(0\)。並且,每張牌被選中的機率是一定的,我們可以針對這些性質,壓縮冗餘的狀態。
直覺告訴我們,\(max(S)\) 顯然是最重要的,我們考慮在狀態裡只加入 \(\max(S)\),再觀察形似折線圖的過程,我們發現對於一個狀態,如果我們在下一次隨機選牌的時候 \(\max(S)\) 變小了,那麼再進入下一個狀態,而如果 \(\max(S)\) 變大了,我們仍然不需要 \(<\max(S)\) 的牌。
所以,這時腦子裡我們可以出現一個大致的 dp 狀態,為了使得不同狀態在機率上是本質相同的,我們不僅要記錄 \(\max(S)\),還要記錄一下我們當前擁有的牌數,並且為了轉移,還要記錄下一個狀態的牌數,即記 \(f_{i,x,y}\) 表示當前 \(\max(S)\) 在第 \(i\) 位,且當前除了最大值以外我們手裡還有 \(x\) 張牌,第一次到 \(\max(S)\) 小於當前最大的機率(換句話說,就是在折線圖中第一個在該點右邊的,且低於當前點的), 然而該過程是波折的,我們還要記一個輔助 dp 陣列,\(g_{j,y}\) 表示從 \((i,x)\) 這個狀態隨機到 \(max(S)\le j\) 且 \(|S|=y\) 的機率,顯然 \(g_{n,x+c_i}=1\),且 \(f_{i,x,y}=g_{i-1,y}\)。接下來就是轉移的事情了,我們試著推出轉移方程式。
這個狀態中,每個數被選擇的機率均是 \(p=\frac{y-x}{j-x}\),因為首先顯然對於初始的 \(x\) 張牌我們永遠不會打出,所以這些不在選擇裡,所以機率是這個。
考慮 \(g_{j,y}\) 的貢獻。如果這個狀態下手裡沒有第 \(j\) 張牌,\(g_{j-1,y} \longleftarrow g_{j,y}\times p\)。
然後,如果有的話,對於 \(g_{j-1,z}\),有 \(g_{j-1,z} \longleftarrow (1-p)\times g_{j,y}\times f_{j,y-1,z}\)。
驚奇的發現,哇,他們是可以互相轉移的!且轉移大體是個 DAG,不需要高消,但為什麼是大體呢,因為我們發現,當 \(i=j,x=y-1\) 時,\(f_{i,x,y}\) 貢獻了自己,我們把他記錄成 \(f_{i,x,y}=k\times f_{i,x,y}+b\),最後再移項就好了。
那麼接下來,答案該怎麼求呢?我們設一個類似於 \(g\) 的狀態,記 \(h_{i,x}\) 表示對於原序列中前 \(i\) 個,選擇了一些必選(初始手裡就有的),和一些之後選擇的,總數為 \(x\) 張牌最後輸光的機率,他很好轉移:
當 \(s_i=1\) 時,我們只能選,那麼轉移為 \(h_{i,x}=\sum f_{i,x-1,y}\times h_{i-1,y}\)。
當 \(s_i=0\) 時,我們有 \(p=\frac{x-sum_n}{i-sum_n}\) 選擇它,那麼轉移為 \(h_{i,x}=(1-p)h_{i-1,x}+p\sum f_{i,x-1,y}\times h_{i-1,y}\)。
最後 \(ans=1-h_{n,sum_n}\),然後我們就做完了!時間複雜度為 \(\mathcal{O}(n^5)\),稍微加點最佳化就能透過。
提交記錄