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 6using
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 都...