【題目】
t 組資料。對於每一組資料,有n+1 個格仔從0 到n 標號,綿羊從0 號結點開始,每次若在 x 位置擲骰子,令擲出的數為num,則跳到 x+num 處。
另外還有 m 個彈簧,綿羊跳到乙個有彈簧的格仔上時,不需要擲骰子便可向右跳到某個位置(若此時仍有彈簧將繼續向右跳),直到到達 n 或者超出 n 停止。
詢問綿羊擲骰子的期望次數。
【輸入格式】
第一行為乙個整數t,表示資料組數。
接下來對於每組資料:首先一行兩個數n, m,含義如題目所述,接下來每行兩個數 a, b,
表示在格仔 a 處有乙個彈簧,將跳到格仔 b 上(保證b>a)。
【輸出格式】
輸出t 行,每行乙個實數,表示保留兩位小數後的答案。
【輸入樣例】
2 08 3
2 44 5
7 8【輸出樣例】
1.17
2.34
看到題目,我們想到每一次的期望跳躍次數是由前面跳過的格仔的期望次數推知的。
也就是說跳到下乙個格仔只與現在跳到的格仔有關,與之前跳過的格仔已經沒有關係了,於是我們考慮使用dp(無後效性)
定義 dp[i] 表示 「在第 i 個格仔跳到終點需要的期望步數」
那麼怎樣賦初值呢?練過許多期望和概率dp的題可以發現:
期望dp一般是倒推,概率dp一般是正推
因為在最後乙個格仔的時候已經跳到終點了,所以期望跳躍步數是0。然後再反向倒推回去,答案就是dp[0]
初值:dp[n]=0 答案dp[0]
想清楚了初值和答案,我們來想想遞推式,從兩種情況入手:
(一)綿羊沒有跳彈簧
沒有跳彈簧就說明可以從i點跳到i+1~i+6點,由
dp[i]+=(dp[i+j]+1)/6 (1<=j<=6)
dp[i+j]表示從i+j這個點跳到了i點(倒推),加一是因為扔了一次骰子,除以6相當於有六分之一的概率扔到1~6中的某乙個數
(二)綿羊跳了彈簧
定義jmp[i]=j表示綿羊可從i點跳到j點,因為有彈簧不用扔骰子,轉移方程為:
dp[i]=dp[jmp[i]]
多組資料記得清零噢!
【**】
#include#define maxn 100005using
namespace
std;
intjmp[maxn],n,m,t,a,b;
double
dp[maxn];
void
clear()
void
solve()
for(int i=n-1;i>=0;i--)
else dp[i]=dp[jmp[i]];
}printf(
"%.2lf\n
",dp[0
]);}
intmain()
return0;
}
完結撒花✿✿ヽ(°▽°)ノ✿誒嘿嘿嘿嘿嘿
紀念一下下小友第一次寫部落格
期望及期望dp
簡單說就是概率 概率的價值 osu x 1 3 x3 3x2 3x 1 可以看出每多出乙個1,答案就會增加3x2 3x 1 於是可以維護x和x2的期望 x1 i x1 i 1 1 p i x2 i x2 i 1 2 x1 i 1 1 p i ans i ans i 1 3 x2 i 1 3 x1 i...
期望dp小結
前言 期望dp狀態的定義是較為顯然的,但對於狀態的轉移往往需要一些公式的推導。關鍵的幾點是狀態之間的互通性,和狀態轉移的花費,以及轉移的概率 解決期望dp的幾個技巧如下 e x y e x e y 我們所求的期望可以化為多個步驟的期望累和 相關題目 j,l 在目標確定的情況下,可以得知在目標到達目標...
期望概率 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...