【期望DP】 HDU 4405 Aeroplane chess

通道

题意:飞行棋,从0到n,置骰子,置到几就往前走几步,前进中会有捷径,比如2和5连到一起了,那你走到2时可以直接跳到5,最后问跳到n时平均置几次骰子

思路:dp[i]:到达i是,离终点的期望次数

代码:

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
const int N=100005;

struct node
{
    int y,next;
};

bool vis[N];
node path[N];
int first[N],t;
double dp[N];

void add(int x,int y) {
    path[t].y=y;
    path[t].next=first[x];
    first[x]=t++;
}

int main() {
    double s;
    int n,m,v;
    while(cin>>n>>m) {
        if(m==0&&n==0) break;
        memset(dp,0,sizeof(dp));
        memset(vis,0,sizeof(vis));
        memset(first,0,sizeof(first));
        int x,y;
        t=1;
        while(m--){
            cin>>x>>y;
            add(y,x);
        }
        dp[n]=-1;
        for(int i=n; i>=0; i--) {
            if(!vis[i]) {
                vis[i]=true;
                s=0;
                for(int k=1; k<=6; k++)
                    s+=dp[i+k];
                s/=6;
                dp[i]+=(s+1);
            }
            for(int k=first[i]; k; k=path[k].next) {
                v=path[k].y;
                dp[v]=dp[i];
                vis[v]=true;
            }
        }
        printf("%.4lf\n",dp[0]);
    }
    return 0;
}
View Code

 

posted @ 2015-08-12 15:02  mithrilhan  阅读(119)  评论(0编辑  收藏  举报