概率DP初步

2021-08-28 14:13:26 字數 1367 閱讀 8280

題目簡述:

乙個r行c列的格仔,起始點在(1,1),終點在(r,c),每一步可能的走法有:不動、向右走、向下走,每走一步花費兩點魔法值,現給出在每一點三種走法的概率,求走完迷宮時所花魔法值的期望。

分析:運用dp演算法的話,首先需要確定乙個合適狀態來描述子問題的情況,很明顯本題的狀態可以定義為dp[i][j],代表從(i,j)到(r,c)所花費魔法值。然後我們需要考慮這樣的狀態之間能否正確的轉化,利用數學期望的定義以及其線性,不難寫出如下轉移方程:

dp[i][j] = p[i][j][1]*dp[i][j] + p[i][j][2]*dp[i][j+1] + p[i][j][3]*dp[i+1][j] + 2
,然後再合併同類項可得:

dp[i][j] = (p[i][j][2]*dp[i][j+1] + p[i][j][3]*dp[i+1][j] + 2)/(1-p[i][j][1])。
最後,需要確定邊界,很明顯,dp[r][c]=0,因為當在點(r,c)時,他不需要花費魔法值就可以到達(r,c),這樣我們就可以從後往前遞推了。

附上**:

#include using namespace std;

const int maxn=1005+10;

double p[maxn][maxn][3],dp[maxn][maxn];

int main()

printf("%.3lf\n",dp[1][1]);

}return 0;

}

題意簡述:

有0-n個格仔,初始點在0,終點是》=n,每走一步之前都要丟一次六個面的色子,標上1-6,扔到幾就走幾步,當然色子是等概率出現數字的,還有就是中間某一點可能和其它的一點聯通,比如a和b聯通,當我處於a時,就可以直接飛到b,最後問走到終點時所扔色子次數的期望。

分析:顯然,首先從後往前推,最後乙個肯定是0,然後,如果有格仔與這次的第i格相連,就可以開始跳躍,不然,就加上dp[1——6]*1.0/6.0,最後再加上1即可,再輸出dp[0]即可輕鬆ac掉。

所以,附上**:

#include using namespace std;

const int maxn=100000+19;

double dp[maxn];

int a[maxn];

int main()

for(int i=n-1;i>=0;i--)

dp[i]=(dp[i+1]+dp[i+2]+dp[i+3]+dp[i+4]+dp[i+5]+dp[i+6])/6+1;

} printf("%.4lf\n",dp[0]);

} return 0;

}

概率dp入門

概率dp主要用於求解期望 概率等題目。轉移方程有時候比較靈活。一般求概率是正推,求期望是逆推。通過題目可以體會到這點。poj2096 collecting bugs include include include include include typedef long long ll using ...

骰子 概率dp

因為會有人被彈出佇列,所以我設定的期望dp為 於是有當只剩乙個人的時候,那個人必勝,再往下,先看它在隊首的情況,其他的情況呢,也就是不在隊首的時候呢,於是,連立這兩個方程組,可以得到 所以,就可以利用乙個pow來處理double型來解決這個問題了。include include include in...

禮物(概率dp)

夏川的生日就要到了。作為夏川形式上的男朋友,季堂打算給夏川買一些生 日禮物。商店裡一共有種禮物。夏川每得到一種禮物,就會獲得相應喜悅值wi 每種禮物的喜悅值不能重複獲得 每次,店員會按照一定的概率pi 或者不拿出禮物 將第i種禮物拿出來。季堂每次都會將店員拿出來的禮物買下來。沒有拿出來視為什麼都沒有...