HDU - 6558/概率dp(从后往前推导)
VJ地址
中文題意:
有一個苦逼程序員小A,他有一個女朋友B,最近看上了一個游戲,他想買這個游戲,可是小A是一個怕老婆的人,每個 月的工資都需要上交,小A找他女朋友商量了好久,最后B同意他用每個月的工作獎金來買游戲,且還需要和B玩智力游戲,贏了才能去買游戲,具體情況是這樣的:
步驟1. 先假設小A 贏 小B的幾率為 q = 2%
步驟2. 這個月小 A 獲得工作獎金的幾率為 P
步驟3. 如果這個月小 A 獲得了工作獎金則轉到步驟 4,否則轉到步驟5
步驟4. 如果小 A 以 q 的勝率贏了小B,小A就可以去買游戲了,如果沒有贏,則 q = min(100%, q+ 2%),并轉到步驟2
步驟5. 小A 不甘心,使得 q = min(100%,q+1.5%),并轉到步驟2進行下一個月
那么請問,當你知道小 A 獲得獎金幾率為 p 的情況下,小 A 預期要用幾個月才能買到自己的游戲(即求 月數 的期望)
思路:
概率dp
dp[i]表示在q的概率等于i的時候,A預計要dp[i]個月才能獲勝(既數學期望),那么當i=100時,dp[i]=1/p;
當小于100時,
因為1.5是小數,不能當下標,所以2,翻倍處理
dp[i]=qi1.0/200.0(贏了)+q(1-i1.0/200.0)(dp[min(i+4,200)]+1)(得了工作獎金但是輸給B)+(1-q)*(dp[min(i+3,200)]+1)(沒有得到工作獎金);
代碼:
#include <bits/stdc++.h> #define lc u << 1 #define rc u << 1 | 1 using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> pii; const int N = 4e6+10; const int inf = 0x3f3f3f3f; const ll INF = 0x3f3f3f3f3f3f3f3f; const ll mod = 1e9+7; const double eps = 1e-8;double dp[210]; int cc; void solve() {double q;cin>>q;q/=100;dp[200]=1/q;for(int i=199;i>=4;i--){dp[i]=q*i*1.0/200.0+q*(1-i*1.0/200.0)*(dp[min(i+4,200)]+1)+(1-q)*(dp[min(i+3,200)]+1);}printf("Case %d: %.9f\n",++cc,dp[4]); } int main() {int t;t=1;cin>>t;while(t--){solve();}return 0; }總結
以上是生活随笔為你收集整理的HDU - 6558/概率dp(从后往前推导)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 玛咖粉的功效与作用、禁忌和食用方法
- 下一篇: 生何首乌的功效与作用、禁忌和食用方法