HDU 4405 Aeroplane chess(期望)

41 篇文章 0 订阅
3 篇文章 0 订阅

做的第一道 概率DP求期望的题。


并且去看了一些期望的总结。 大体也就是 对于一个目标状态。 倒着往出状态推。 并且设 目标状态的 期望为0. 那么根据状态转移方程


一般就可以求出后继的状态了。( 这些都是 无环的)


对于这个题亦是如此。 目标位置是en。 那么 dp【en】 = 0;


对于位置 i  对于 能够直接到达 i 的点。 期望是相等的。


否则 dp【i】 = (dp【i+j】+1)/6 (1<=j<=6);


#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
#define MAXN 100000 + 10
double dp[MAXN] = {0};
int used[MAXN] = {0};
vector <int> q[MAXN];
int main (){
    int en,n;
    while(scanf("%d%d",&en,&n) != EOF){
        if(en == 0 && n == 0)
            break;
        memset(dp,0,sizeof(dp));
        memset(used,0,sizeof(used));
        for(int i = 0; i <= en; i++)
            q[i].clear();
        for(int i = 0; i < n; i++){
            int from,to;
            scanf("%d%d",&from,&to);
            q[to].push_back(from);
        }
        for(int i = 0; i < q[en].size(); i++){
            dp[q[en][i]] = 0;
            used[q[en][i]] = 1;
        }
        for(int i = en-1; i >= 0; i--){
            if(!used[i]){
                used[i] = 1;
                for(int j = i+1; j <= i+6; j++){
                    dp[i] += (dp[j]+1)/6;
                }
            }
            for(int j = 0; j < q[i].size(); j++){
                dp[q[i][j]] = dp[i];
                used[q[i][j]] = 1;
            }
        }
        printf("%.4lf\n",dp[0]);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值