題目大致意思: 總共有n種郵票,每選一張郵票,郵票的**會加一,郵票的初始值是1,最後問拿完n種郵票的期望**。
思路:發表一下看這個題題解的感想:這個題太仙了,概率dp的套路司空見慣就是把陣列定義成已經考慮前i個—到n的期望。那麼我們先開乙個陣列來記錄,f記錄從已經選了i個從第i種開始選到第n種的期望步數,那麼轉移就來了,只有兩種情況,第一種是選到了之前選了郵票,第二種選了之前沒選的郵票,
f[i]=(i/n)(f[i]+1)+((n-1)/n) (f[i+1]+1),為什麼要在每個裡面加一呢,代表走出第i種決策的一步。f陣列還是比較好想的,但是我們最後要求的是期望花費呀,秉承著要求什麼就開什麼的原則,那麼我們另外乙個陣列,代表選了i種到選完n種的花費,兩個陣列的初始化都是f[n]=0,g[n]=0,概率dp的套路我目前看到的都是反著推的,遞推式就是
g[i]=i/n(g[i]+f[i]+1)+(n-i)/n(g[i+1]+f[i+1]+1)**,當時一直想不明白 這個f陣列有啥關係呀,但仔細想想,我們從這個狀態轉移出去,如果還是轉移到原來狀態,這一步是第一步花費是1,但是因為前面說的郵票買的越多**越高,對g產生了後效性,由於之前算的要走k步,裡面的每一步都會有1這個增量,所以就是加了f[i].
**很簡單,重在推下來的思路:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define x first
#define y second
#define int long long
#define lson u<<1
#define rson u<<1|1
#define pb push_back
#define pu pushup
#define mk make_pair
using
namespace std;
#define ll long long
#define mod 1000000007
inline
intread()
while
(ch>=
'0'&&ch<=
'9') s=s*
10+ch-
'0',ch=
getchar()
;return s*w;
}const
int n=
10010
;double f[n]
,g[n]
;signed
main()
概率DP 期望雜題
1.f i j 前i個人,有j個人正常出局的概率 f i j f i 1 j p1 f i 1 j 1 p2 留下來 被日死 正常出局 p 別人出局後自己被日死的概率 p2 1 p j 1 p1 1 p1 f i k p2 前k個過後都沒有被日死 最後再 inv 1 n 這一輪出局概率 includ...
神仙DP 單調佇列 模擬題 區間覆蓋
傳送門 給出數軸上的n個線段,保留最多k條線段,問這些被保留下來的線段的並集長度為最多為多少。第一行兩個數n和k 接下來n行,每行兩個數,表示一條線段的左右端點。0 每個數 109 乙個數表示答案。321 87152 14 12對於30 的資料,1 n 20 對於60 的資料,1 n 300 對於1...
概率期望dp入門題 遊戲
題目 alice 和 bob 兩個人正在玩乙個遊戲,遊戲有很多種任務,難度為 p 的任務 p是正整數 有 1 2 p 的概率完成並得到 2 p 1 分,如果完成不了,得 0 分。一開始每人都是 0 分,從 alice 開始輪流做任務,她可以選擇任意乙個任務來做 而 bob 只會做難度為 1 的任務。...