标签:
http://acm.split.hdu.edu.cn/showproblem.php?pid=4405
概率DP主要用于求解期望、概率等题目。
一般求概率是正推,求期望是逆推。
kuangbin的概率DP学习网址:http://www.cnblogs.com/kuangbin/archive/2012/10/02/2710606.html
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <vector> 5 using namespace std; 6 #define N 100010 7 8 double dp[N]; 9 int nxt[N]; 10 11 int main() 12 { 13 int n, m; 14 while(~scanf("%d%d", &n, &m), n+m) { 15 memset(nxt, -1, sizeof(nxt)); 16 for(int i = 0; i < m; i++) { 17 int u, v; 18 scanf("%d%d", &u, &v); 19 nxt[u] = v; 20 } 21 memset(dp, 0, sizeof(dp)); 22 double dec = (double)1 / 6; 23 for(int i = n - 1; i >= 0; i--) { 24 if(nxt[i] != -1) { 25 dp[i] = dp[nxt[i]]; //如果可以飞,就直接把上一步的值赋给它 26 continue; 27 } 28 for(int j = 1; j <= 6; j++) { 29 if(i + j <= n) { 30 dp[i] += dp[i + j] * dec; //不能飞的话,就掷骰子为1-6的概率都为1/6,递推 31 } 32 } 33 dp[i]++; //走到下一步要+1 34 } 35 printf("%.4f\n", dp[0]); 36 } 37 return 0; 38 }
HDU 4405:Aeroplane chess(概率DP入门)
标签:
原文地址:http://www.cnblogs.com/fightfordream/p/5788582.html