HDU 4405 Aeroplane chess

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4405


题意:一个人在玩飞行棋,一共有n个点和m条航线,每一条航线有x,y,如果到达点x那么会直接到达点y(x<y),初始在1,当坐标大于等于n时游戏结束。每一步会投一个六面骰子来决定移动步数,求游戏结束的期望投掷次数。


思路:f[i]表示在i点时游戏结束的期望次数。f[i] = 1 / 6( ∑f[i+j] ) + 1  (1<=j<=6) 或者   f[i] = f[ pos[i] ] i->pos[i]是一条航线。


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define rep(i,j,k) for(int i=j; i<=k; i++)
#define Clean(x,y) memset(x,y,sizeof(x))

const int maxn=100009;

int aim[maxn];
bool flag[maxn];
double f[maxn];
int n,m;

int main()
{
    while(cin>>n>>m)
    {
        if(m+n==0) break;
        Clean(f,0);
        Clean(flag,false);
        Clean(aim,0);
        int x,y;
        rep(i,1,m)
        {
            scanf("%d %d",&x,&y);
            flag[x]=true;
            aim[x]=y;
        }
        rep(i,1,n)
        {
            int temp=aim[i];
            while(aim[temp]) temp=aim[temp];
            aim[i]=temp;
        }
        f[n]=0;
        for(int i=n-1;i>=0;i--)
        {
            if (flag[i]) f[i] = f[ aim[i] ];
            else f[i]=(f[i+1]+f[i+2]+f[i+3]+f[i+4]+f[i+5]+f[i+6])/6+1;
        }
        printf("%0.4f\n",f[0]);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值