hdu 4405 Aeroplane chess 动态规划

题目链接: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;
}
原文地址:https://www.cnblogs.com/dishu/p/4295100.html