ZOJ 3329(概率DP,推導)

2022-05-24 15:39:10 字數 1903 閱讀 7358

2015-01-03 12:34:02

思路:這題是概率dp,公式不好推.....一定要細心。(晚上推到凌晨,早上起來再推終於過了.....i am so ruo!qaq)(深深地感覺到自己的方法比網上的麻煩....)

用dp[i]表示當前計數器的值為 i ,還需要擲多少次(期望值)使得遊戲結束,那麼轉移方程是不難列出來的:dp[i] = sigma(dp[i + j] + 1.0) / total + dp[0] / total,(3<=j<=k1*k2*k3,total = k1*k2*k3),發現每個dp[i]都會衍生出乙個含dp[0]的項。

再詳細點:如果我們要算4 2 2 2 1 1 1

dp[0] = (3 * (dp[4] + 1) + 3 * (dp[5] + 1) + (dp[6] + 1)) / total +(dp[0] + 1) / total(沒有dp[3],因為擲到三個1的話,計數器置零)

dp[4] = (3 * (dp[8] + 1) + 3 * (dp[9] + 1) + (dp[10] + 1)) / total +(dp[0] + 1) / total

因為 : dp[5] ~ dp[10] = 0

所以:  dp[0] = (3 * (dp[4] + 1) + 4) / total +(dp[0] + 1) / total

dp[4] = (3 + 3 + 1) / total +(dp[0] + 1) / total

-->dp[0] = 【3 *(7 / total +(dp[0] + 1) / total+ 1) + 4】/ total +(dp[0] + 1) /total

發現每乙個dp的表示式中都有(dp[0] + 1)這一項,那麼我們可以把dp表示式寫成dp[i] = a[i] *(dp[0] + 1)+ b[i]

而a[i]可以由a[i + j](1<=j<=total)求出,b同理....那麼可以用記憶化搜尋解決。

由:a[i] =sigma(a[i + j] + 1)/ total , b[i] = (sigma(b[i + j])+ 1) / total(這個b不太好理解....其實i+j中的a[i+j]代到i中後(a[i + j] * (dp[0] + 1) + 1) / total,會產生1 / total,應記入b[i])

那麼:dp[0] = (a[0] + b[0]) / (1.0 - b[0])

(當然也可以用遞推啦~)

1 #include 2 #include 3 #include 4 #include 5 #include 6

using

namespace

std;

7#define mp(a,b) make_pair(a,b)

8 typedef pairdouble,long

double>pdd;

9const

int inf = (1

<< 30) - 1;10

11int

t,n,k1,k2,k3,a,b,c;

12long

double a[550],b[550

],total;

1314

void solve(int

p)25}26

}27 a[p] = res /total;

28 b[p] = (tmp + 1.0) /total;29}

3031

intmain()

41return0;

42 }

ZOJ3329(數學推導 期望遞推)

要點 1.期望的套路,要求n以上的期望,則設dp i 為i分距離終點的期望步數,則終點dp值為0,答案是dp 0 2.此題主要在於數學推導,一方面是要寫出dp i 什麼,雖然一大串但是思維上並不難 然後就是一種解方程的方法,因為都跟dp 0 有關,且dp 0 是個確定的常數,所以設dp i a i ...

zoj3640 概率(期望)dp

題目大意 有乙個吸血鬼,初始攻擊力為f,每天隨機走到n個洞裡面,每個洞有乙個c i 如果他的攻擊力f c i 則可以花費t i 的時間逃走,否則則花費一天時間使自己的攻擊力增加c i 求逃走天數的期望 分析 這道題求期望,考慮採用概率dp求解 想到的最簡單方法就是dp i j 表示 第i天,攻擊力為...

ZOJ3718 Diablo II 狀態壓縮dp

題意 乙個人物有k k 7 種技能,每種技能都有bi,ci,di值,表示該技能不能點超過bi次,每點一次加ci,點滿bi次有乙個附加得分di。然後還有n件 本身會有能力加成,然後每個 可能會對應著多種的技能,當你裝備了這些 的時候對應的技能的技能點 1 但是 的技能點不能重複,也就是如果a 和b 都...