2018.09.01 hdu4405 Aeroplane chess (期望dp)

时间:2021-03-25 18:28:40

传送门

期望dp简单题啊。

不过感觉题意不太对。

手过了一遍样例发现如果有捷径必须走。

这样的话就简单了啊。

设f[i]" role="presentation" style="position: relative;">f[i]f[i]表示从第i个格子出发到第n个格子的期望步数。

显然就可以从f[i+1]~f[i+6]转移过来了,注意如果f下标超过n期望步数都是0。

代码:

#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,m,jump[N];
double f[N];
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
int main(){
    while(scanf("%d%d",&n,&m)){
        if(!n&&!m)break;
        memset(jump,0,sizeof(jump));
        for(int i=1;i<=m;++i){int u=read(),v=read();jump[u]=v;}
        f[n]=0;
        for(int i=n-1;~i;--i){
            f[i]=0;
            if(jump[i]){f[i]=f[jump[i]];continue;}
            for(int j=1;j<=6;++j){
                int k=min(i+j,n);
                f[i]+=f[k];
            }
            f[i]=f[i]/6.0+1;
        }
        printf("%.4lf\n",f[0]);
    }
    return 0;
}