题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4405
所谓概率DP大多是算期望
算期望大多是从终点往回推
简单的1维动态规划
dp[i]表示第i格到终点的期望步数
从终点往前推
若当前为某条捷径的起点 那么该点的dp值直接等于捷径终点的dp值
否则枚举掷出1到6时所到的位置的期望 用最朴素的方法求期望
dp[0]即为所求
#include <cstdio> #include <cstdlib> #include <ctime> #include <iostream> #include <cmath> #include <cstring> #include <algorithm> #include <stack> #include <set> #include <queue> #include <vector> using namespace std; const int maxn = 100010; double dp[maxn]; int e[maxn]; int main() { //freopen("in.txt", "r", stdin); int n, m; while(scanf("%d%d", &n, &m) == 2 && n != 0) { memset(e, -1, sizeof(e)); memset(dp, 0, sizeof(dp)); int u, v; for(int i = 0; i < m; i++) { scanf("%d%d", &u, &v); e[u] = v; } for(int i = n-1; i >= 0; i--) { if(e[i] != -1) dp[i] = dp[e[i]]; else { for(int j = 1; j <= 6; j++) { dp[i] += (dp[i+j] + 1)/6; } } } printf("%.4f ", dp[0]); } return 0; }