当前位置: 代码迷 >> 综合 >> 【HDU4405】Aeroplane chess
  详细解决方案

【HDU4405】Aeroplane chess

热度:0   发布时间:2024-01-13 10:00:24.0

题目链接:传送门
题解
求期望从后往前递推
f[i] 表示从 i >=n 的期望
很容易得到 f[i]=1+6j=1f[i+j] ,加的 1 是这一步的步数
实际上把 >=n 的都存到 n 里就可以了
如果点i可以飞向点j,直接 f[i]=f[j] 即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;const int N=100010;
int n,m;
double f[N];
int fly[N];int main()
{while(~scanf("%d%d",&n,&m)&&(n||m)){memset(fly,0,sizeof(fly));for(int i=1,u,v;i<=m;i++){scanf("%d%d",&u,&v);fly[u]=v;}f[n]=0;for(int i=n-1;i>=0;i--){if(fly[i]) f[i]=f[fly[i]];else{f[i]=1;for(int j=1;j<=6;j++)f[i]+=(f[min(i+j,n)])/6;}}printf("%.4f\n",f[0]);}return 0;
}