HDU4405 Aeroplane chess(期望dp)

入门第二题概率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]);
	}
} 
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页