hdu4405 概率dp

飞行棋游戏 问从0结束游戏的投色子次数期望是多少

设dp[i]表示i到n的期望,那么可以得到dp[i]=(dp[i+1]+dp[i+2]+dp[i+3]+dp[i+4]+dp[i+5]+dp[i+6])/6+1,另外注意飞行航道和处理离终点6以内的特殊点。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

const int maxn=100010;
const double t=(double)1/(double)6;

int g[maxn],n,m;
double dp[maxn];

double go(int i,int d)
{

    if (i+d>=n)
        return t;
    int pos=g[i+d];
    while (pos!=-1)
    {
        if (g[pos]==-1)
            break;
        else
        {
            pos=g[pos];
        }
    }
    if (pos==-1)
        pos=i+d;
    return t*(dp[pos]+1);
}

int main()
{
    int i,j,x,y;

    while (scanf("%d%d",&n,&m)==2)
    {
        if (n==0&&m==0)
            break;
        for (i=0;i<=n;i++)
        {
            g[i]=-1;
            dp[i]=0;
        }
        for (i=0;i<m;i++)
        {
            scanf("%d%d",&x,&y);
            g[x]=y;
        }
        for (i=n-1;i>=0;i--)
        {
            for (j=1;j<=6;j++)
            {
                dp[i]+=go(i,j);
            }
        }

        printf("%.4lf\n",dp[0]);
    }
}

 

posted @ 2017-09-10 00:42  Aragaki  阅读(98)  评论(0编辑  收藏  举报