HDU4405Aeroplane chess
题意&思路:
飞行棋,有些点直接相连,即可以从x点直接到y点(x<=y),问投骰子次数的期望。
期望dp。我们可以得到在dp[n]之后次数肯定为0,所以从后推,可得dp[i]=dp[i+1]/6+dp[i+2]/6+dp[i+3]/6+dp[i+4]/6+dp[i+5]/6+1。
对于路径x->y,因为我们不需要耗费次数就可以从x到y,所以可以得到dp[x]=dp[y]。
代码:
#include<bits/stdc++.h>
const int N=1e5+10;
const int mod=1e7+9;
const int maxn=0x3f3f3f3f;
const int minn=0xc0c0c0c0;
const int inf=99999999;
using namespace std;
double dp[N];
int road[N];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m))
{
if(n==0 && m==0)
break;
int i,j;
memset(dp,0,sizeof(dp));
memset(road,0,sizeof(road));
for(i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
road[u]=v;
}
for(i=n-1;i>=0;i--)
{
if(road[i])
dp[i]=dp[road[i]];
else
{
for(j=1;j<=6;j++)
dp[i]+=dp[i+j]/6;
dp[i]++;
}
}
printf("%.4lf\n",dp[0]);
}
return 0;
}