POJ 3519

题意:模拟大富翁,求在t步之内走到终点的概率。

题解:记忆化搜索,dp[p][k]为在p点走了k步且最后到达终点的概率,其它都是简单模拟。

View Code
 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 using namespace std;

 5 const double eps=1e-8;

 6 const int N=105;

 7 double dp[N][N];

 8 int v[N];

 9 int n,t;

10 int next(int p,int s)

11 {

12     p+=s;

13     if(p<=n)

14         return p;

15     else

16         return 2*n-p;

17 }

18 double dfs(int p,int k)

19 {

20     if(k>t)

21         return 0.0;

22     else if(p==n)

23         return 1.0;

24     else if(dp[p][k]>-eps)

25         return dp[p][k];

26     double ans=0;

27     for(int i=1;i<=6;i++)

28     {

29         int np=next(p,i);

30         if(v[np]==2)

31             ans+=dfs(0,k+1)/6.0;

32         else if(v[np]==1)

33             ans+=dfs(np,k+2)/6.0;

34         else

35             ans+=dfs(np,k+1)/6.0;

36     }

37     return dp[p][k]=ans;

38 }

39 int main()

40 {

41     int l,b;

42     while(scanf("%d%d%d%d",&n,&t,&l,&b),(n||t||l||b))

43     {

44         int tp;

45         memset(v,0,sizeof(v));

46         while(l--)

47         {

48             scanf("%d",&tp);

49             v[tp]=1;

50         }

51         while(b--)

52         {

53             scanf("%d",&tp);

54             v[tp]=2;

55         }

56         for(int i=0;i<=n;i++)

57             for(int j=0;j<=t;j++)

58                 dp[i][j]=-1;

59         printf("%.6lf\n",dfs(0,0));

60     }

61     return 0;

62 }

你可能感兴趣的:(poj)