题目大意:通过摇筛子,做0跳到n点,有些点可以直接过渡,问要到达n点,需要摇色子的次数的期望值?
Idea:
常规的DP求期望
dp[i]代表从i点要到达N点的期望值;
状态转移方程:
首先dp【N】=0;
其次分两种情况:
(1)i点不可以过渡,dp【i】=sum((dp【i+j】+1)/6)
(2)i点可以过渡到j点,dp【i】=dp[ j ]
自己体会吧,醉了。
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
double dp[100010];
int line[100010];
int main()
{
int n,m,i,j,k,x,y;
while(scanf("%d%d",&n,&m)&&(n||m))
{
memset(dp,0,sizeof(dp));
memset(line,0,sizeof(line));
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
line[x]=y;
}
for(i=n-1;i>=0;i--)
{
if(line[i]){
dp[i]=dp[line[i]];
}
else {
for(j=1;j<=6;j++)
dp[i]+=(dp[j+i]+1)/6;
}
}
printf("%0.4lf\n",dp[0]);
}
return 0;
}