演算法 概率與期望DP

2022-05-20 07:13:34 字數 1338 閱讀 4936

前兩節主要針對題目分析,沒時間的珂以跳過。

首先舉一道簡單、經典的好題:

[lightoj1038]race to 1 again

懶得單獨寫,安利一下dennyqi同學的部落格:

很顯然很多期望題的狀態是和自己有關的,怎麼辦呢,難道不停的搜尋自己?

上面的方法顯然行不通,於是我們只能簡單變形一下。

很容易列出方程:

\[f[n]= \frac^f[fac_n^i]} + 1

\]其中\(m\)表示因子個數,\(fac_n^i\)表示\(n\)的第\(i\)個因子。

鑑於要讓右邊消去後效性,兩邊同時乘以\(m\),移項即可。

再舉一道稍微複雜一點的題目:

[zoj3329]one person game

題意簡述:

有三個骰子,分別有k1, k2, k3個面。

記錄乙個初值為0的分數,每次擲骰子,如果三個面分別為a, b, c則分數置0,否則加上三個骰子的分數之和。

當分數大於n時結束。求遊戲的期望步數。

設f[i]為當前已經獲得了i分時,遊戲結束的期望步數。

為了方便表示我們不妨設p[i]為投到點數為i的概率,特殊的p[0]為回到0的概率。

很容易想到如下遞推:

\[f[i]=\sum(p[k] \times dp[i+k])+dp[0] \times p[0]+1

\]一眼看過去大清亡了,成環了,能用高斯消元也就算了,關鍵是高斯消元會tle。

我們發現我們需要求的東西只有f[0],於是我們分離常數,令f[i]=a[i]*f[0]+b[i]

那麼顯然我們要求的f[0]就喜聞樂見地變成了\(\frac\)。

顯然我們只需要遞推計算a與b就能求出答案(廢話)。

那麼稍加變形得到a,b的遞推式如下

\[f[i] = \sum(p[k] \times a[i + k] \times f[0] + p[k] \times b[i + k]) + f[0] * p[0] + 1

\]\[=(\sum(p[k] \times a[i + k]) + p[0]) f[0] + \sum(p[k] \times b[i + k]) + 1

\]\[a[i]=\sum(p[k] \times a[i+k])+p[0],b[i]=\sum(p[k] \times b[i+k])+1

\]那麼求a, b就變得非常簡單了qaq。

對於未知狀態徹底成環又無法轉化的情況,只能使用高斯消元。

咕咕咕。

1、變形遞推式消去後效性

2、只求部分值可以分離常數

3、成環使用高斯消元

咕咕咕,(flag:預計本週補完)。

dp 概率與期望dp Dumb Bones

你正在嘗試用多公尺諾骨牌搭成一條直線,以便最後試驗時推倒它們 確實,搭建某些東西僅僅為了推倒看上去沒啥意義,但你有一些奇怪的愛好 然而你在搭建過程中可能會弄倒骨牌,這將波及到鄰近的部分 現在需要你來求將骨牌搭建完成所需的期望步數 若干組資料,以0結尾 乙個整數n 1 leq n leq 1000 1...

期望概率 dp

p4316 綠豆蛙的歸宿 p1850 noip2016 提高組 換教室 p3802 小魔女帕琪 p5104 紅包發紅包 p4550 收集郵票 f i frac f i 1 frac f 1 g i frac g i f i 1 frac g f 1 p1291 shoi2002 百事世界盃之旅 p3...

(概率dp 期望)Collecting Bugs

題目是真的長,找了半天才知道n和s是啥,題意就是有s個程式,n種bug 每一天必定發現乙個bug,但是這個bug有1 s概率屬於其中乙個程式,1 n的概率屬於一種bug,求s個程式要發現n種bug的概率。kuangbin大佬部落格 期望從結果倒著推到初始狀態 dp i j i n s dp i j ...