入门第二题概率DP

想到了,不敢写

定义 d p [ x ] dp[x] dp[x]为在 x x x位置期望仍筛子 d p [ x ] dp[x] dp[x]次必定到达 d p [ n ] dp[n] dp[n]\

那么 d p [ n ] = 0 dp[n]=0 dp[n]=0

所以每个 x x x可以从后面的 d p [ x + 1 ] 到 d p [ x + 6 ] dp[x+1]到dp[x+6] dp[x+1]到dp[x+6]转移而来

超出 n n n就算从 n n n转移而来(然而无所谓,期望都是0)

如果当前的 x x x可以传送到 y y y

说明 d p [ x ] = d p [ y ] dp[x]=dp[y] dp[x]=dp[y]

最后输出 d p [ 0 ] dp[0] dp[0]

因为是从第 0 0 0格开始跳而不是 1 1 1

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int n,m,ok[maxn];
double dp[maxn];
int main()
{
while( cin >> n >> m&&(n+m) )
{
for(int i=1;i<=m;i++)
{
int l,r; cin >> l >> r;
ok[l]=r;
}
dp[n]=0;
for(int i=n-1;i>=0;i--)
{
dp[i]=0;
for(int j=1;j<=6;j++)
if( i+j<=n ) dp[i]+=dp[i+j]/6.0;
else dp[i]+=dp[n]/6.0;
dp[i]+=1;
if( ok[i] ) dp[i]=dp[ ok[i] ];
}
for(int i=0;i<=n;i++) ok[i]=0;
printf("%.4lf\n",dp[0]);
}
}