指望真是個很神奇的東西啊,雖然利用方程移項能夠證實,但總感受很妙html
設數\(x\)有\(n\)種取值,每種取值\(a_i\)對應機率爲\(p_i\),則\(x\)的數學指望爲\(E(x)=\sum a_ip_i\)算法
雖然這些指望都是小數,是取不到的值,但指望表示的並非一個可能發生的狀況,而是狀況的一個平均,能夠形象地理解爲當實驗進行愈來愈多的時候,平均狀況會趨於接近指望(好比擲骰子\(100\)次的時候,平均狀況會接近\(3.5\),而當擲\(10^6\)次的時候,會更加接近\(3.5\))優化
更通常的,若\(x\)的取值並非離散的,那麼能夠用積分表達指望 換湯不換藥spa
一枚硬幣,拋到正面的機率爲\(p\),問指望拋幾回獲得一個正面.net
先設答案爲\(x\)次,根據指望的定義能夠列出式子\(x=p\cdot 1+(1-p)(x+1)\),能夠移項得出\(x=\frac 1p\)code
解釋一下那個式子的右邊,考慮擲一次有兩種狀況:htm
列出這個方程能夠解出其中某一項,可能這就是指望題目的大體玩法吧blog
給定一個有\(n\)個面的骰子,問指望多少次能擲出全部面(SPOJ-FAVDICE)ip
發現這題不能像上一題那樣只設一個變量,因此須要利用dp思想,設\(f_i\)表示還剩\(i\)面未被擲到時指望還需多少次完成get
利用上一題的思想枚舉全部後繼狀況,假設當前還剩\(i\)面未被擲到
而這兩個之和爲\(f_i\),即\(f_i=\frac in(f_{i-1}+1)+\frac {n-i}n(f_i+1)\),移項可得\(f_i=f_{i-1}+\frac ni\)
而\(f_0=0\),則遞推出\(f_n\)即爲答案
從這題能夠看出一種解題方法,設置狀態,列出方程,解出其中某一項,進行dp轉移
你有一個戰鬥力\(v\),有\(n\)扇門,天天隨機抽取一扇門\(i\),若\(v\leq c_i\),則會用\(t_i\)天的時間離開,不然\(v\)增長\(c_i\),求離開天數的指望(ZOJ-3640)
這題也差很少,算是一個小練習,設\(f_i\)表示當戰鬥力爲\(i\)時離開的指望天數
若\(i\leq c_i\),\(f_i+=\frac 1nf_{i+c_i}\),不然\(f_i+=\frac 1nt_i\)
綜合這最後這兩題能夠看出,若是用Dp解簡單的指望題,狀態的設置須要知足可重複利用(好比當戰鬥力爲一個確值\(x\)時,指望天數必定是個定值)
double f(int x){ if(x>max_c)return sum_t/n; if(dp[x]>-0.5)return dp[x]; double res=0; for(int i=1;i<=n;++i) if(x<=c[i])res+=1+f(x+c[i]); else res+=t[i]; return dp[x]=res/n; }
有些題目是沒有像上面題目那樣的單項轉移的,好比說下面這題
一個\(n\)點\(m\)邊無向連通圖,在圖上進行隨機遊走,初始時在\(1\)號頂點,每一步以相等的機率隨機選擇當前頂點的某條邊,沿着這條邊走到下一個頂點,得到等於這條邊的編號的分數。當到達\(n\)號頂點時遊走結束,總分爲全部得到的分數之和。 要求對全部邊進行編號(\(1\)~\(m\)),使得總分的指望值最小。(HNOI-2013遊走)
很明顯的貪心思路:求每條邊的訪問次數指望,按照指望大小次序給定邊權,再給邊權賦值
可是求邊的指望又能夠由邊兩邊的點的指望獲得,因此這題的主要難度在於求每一個點的訪問次數指望
用以前的方法進行設置。設\(f_i\)表示走到\(i\)節點的次數指望
因爲任意兩點間都有可能互相訪問,因此對於任意一條邊\((u,v)\),\(f_u+=\frac 1{deg_v}f_v,f_v+=\frac 1{deg_u}f_u\)
發現這裏不能像以前幾道題來解方程了,由於這裏存在循環(\(f_1\)要用\(f_2\)推導,\(f_2\)要用\(f_1\)推導)
能夠利用高斯消元求解,時間複雜度\(O(n^3)\)
相似的題還有不少,好比HNOI-2011XOR和路徑
下面介紹兩種循環轉移的非高斯消元解法(複雜度\(O(n)\))
有三個骰子,分別有\(k_1,k_2,k_3\)面,每次同時投擲得\(x_1,x_2,x_3\),分數增長\(x_1+x_2+x_3\),若三者的值分別爲\(a,b,c\),則分數清零,若分數大於\(n\),則結束操做。求指望多少次投擲後結束操做(zoj-3329)
嘗試用上一題的作法來解,設\(f_i\)表示當前分數爲\(i\)時的指望還要進行多少次,令\(p_k\)表示三個骰子分數和爲\(k\)的機率
則能夠列出方程:\(f_i=\sum_kp_k(f_{i+k}+1)\)
將\(1\)提出來,把\(p_0\)單獨提出來,獲得\(f_i=1+f_0p_0+\sum_{k\not =0}p_kf_{i+k}\)
捨棄以前說的高斯消元作法,介紹一種更優秀的作法
因爲全部式子都要用到\(p_0\),因此不妨假設\(f_i=a_ip_0+b_i\)
而後將\(f_{i+k}=a_{i+k}p_0+b_{i+k}\)套到以前的式子裏去,獲得
\(f_i=1+f_0p_0+\sum_{k\not =0}p_k(a_{i+k}f_0+b_{i+k})\\=(p_0+\sum_{k\not =0}p_ka_{i+k})f_0+\sum_{k\not =0}p_kb_{i+k}+1\)
對比式子:\(f_i=a_ip_0+b_i\),發現兩個式子結構相同,可得:
\(a_i=p_0+\sum_{k\not =0}p_ka_{i+k}\\b_i=1+\sum_{k\not =0}p_kb_{i+k}\)
因爲\(a_i,b_i=0(i>n)\),而上面的式子中全部量是能夠遞推而得,沒有循環轉移關係的,因此能夠遞推獲得\(a_0,b_0\)
將\(i=0\)代入,獲得\(f_0=a_0f_0+b_0\),即\(f_0=\frac {b_0}{1-a_0}\),得解
一棵 \(n\) 個結點的樹,從點 \(x\) 出發,每次等機率隨機選擇一條與所在點相鄰的邊走過去。\(Q\) 次詢問,每次詢問給定一個集合 \(S\),求若是從 \(x\) 出發一直隨機遊走,直到點集 \(S\) 中全部點都至少通過一次的話,指望遊走幾步。(pkuwc2018隨機遊走)
這題以前就寫過題解,在這,能夠看看中間如何將樹上狀況的循環轉移優化成遞推
基本思路也是設每一個節點從父親轉移,遞推求得係數\(a_i,b_i\),這樣是\(O(n)\)的
這個待填坑吧,分層圖好像能夠玩,據說去年pkuwc上有人想出了一個在通常圖上高斯消元的高效算法