2 0 8 3 2 4 4 5 7 8 0 0
1.1667 2.3441
题目大意:
飞行棋。给一组数据 N,M ,N代表有N+1(一维,0->N)个格子,你的起始点是在0号位置,M代表你有M条航班,接下来会有M行,每行两个整数X,Y,表示在位置X和位置Y有一条航班,可以直接从X飞到Y,投掷一枚骰子,投掷多少就能走多少步,如遇到航班,则按照航班走,航班可以连续,每个航班的起始点不同。输出投掷色子次数的期望。
解题思路:
dp [ n ]=0,dp [ i ]=sum( dp [i+j] ) +1, j 从1累加到6,因为期望代表的是步数,所以每次加 1 步,当遇到航班 (x,y)时,则记dp [ x ] = dp [ y ] ,则结果等于dp [0].
代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int maxN=100010;
int main(){
int a,b,n,m,visited[maxN];
double dp[maxN];
while(~scanf("%d%d",&n,&m)&&(n||m)){
for(int i=0;i<n;i++){
visited[i]=-1;
}
for(int i=0;i<=n+5;i++){
dp[i]=0;
}
for(int i=0;i<m;i++){
scanf("%d%d",&a,&b);
visited[a]=b;
}
for(int i=n-1;i>=0;i--){
if(visited[i]==-1){
for(int j=1;j<=6;j++){
dp[i]=dp[i+j]/6.0+dp[i];
}
dp[i]+=1;
}
else dp[i]=dp[visited[i]];
}
printf("%.4lf\n",dp[0]);
}
return 0;
}
HDU 4403(Aeroplane chess ,求期望,概率DP)
原文:http://blog.csdn.net/hush_lei/article/details/39052765