zoukankan      html  css  js  c++  java
  • zoj 3329 One Person Game (有环 的 概率dp)

    题目链接

    这个题看的别人的思路,自己根本想不出来这种设方程的思路。

    题意:

    有三个骰子,分别有k1,k2,k3个面。
    每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和。
    当分数大于n时结束。求游戏的期望步数。初始分数为0
    思路转载自: http://www.cnblogs.com/kuangbin/archive/2012/10/03/2710648.html

    分析:

    设dp[i]表示达到i分时到达目标状态的期望,pk为投掷k分的概率,p0为回到0的概率
    则dp[i]=∑(pk*dp[i+k])+dp[0]*p0+1;
    都和dp[0]有关系,而且dp[0]就是我们所求,为常数
    设dp[i]=A[i]*dp[0]+B[i];
    代入上述方程右边得到:
    dp[i]=∑(pk*A[i+k]*dp[0]+pk*B[i+k])+dp[0]*p0+1
         =(∑(pk*A[i+k])+p0)dp[0]+∑(pk*B[i+k])+1;
         明显A[i]=(∑(pk*A[i+k])+p0)
         B[i]=∑(pk*B[i+k])+1
         先递推求得A[0]和B[0].
         那么  dp[0]=B[0]/(1-A[0]);

    本题通过代换系数,化简后求系数。

    一般形成环的用高斯消元法求解。但是此题都是和dp[0]相关。所有可以分离出系数。

     
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <queue>
     6 #include <cmath>
     7 #include <algorithm>
     8 #define LL __int64
     9 const int maxn = 500+50;
    10 using namespace std;
    11 double p[maxn], A[maxn], B[maxn];
    12 
    13 int main()
    14 {
    15     int t, n, a, b, c, k1, k2, k3;
    16     int i, j, k;
    17     cin>>t;
    18     while(t--)
    19     {
    20         cin>>n>>k1>>k2>>k3>>a>>b>>c;
    21         double p0 = 1.0/k1/k2/k3;
    22         memset(p, 0, sizeof(p));
    23         for(i = 1; i <= k1; i++)
    24         for(j = 1; j <= k2; j++)
    25         for(k = 1; k <= k3; k++)
    26         if(i==a && j==b && k==c) continue;
    27         else
    28         p[i+j+k] += p0;
    29 
    30         memset(A, 0, sizeof(A));
    31         memset(B, 0, sizeof(B));
    32         for(i = n; i>= 0; i--)
    33         {
    34             A[i] = p0; B[i] = 1;
    35             for(j = 1; j <= k1+k2+k3; j++)
    36             {
    37                 A[i] += A[i+j]*p[j];
    38                 B[i] += B[i+j]*p[j];
    39             }
    40         }
    41         printf("%.12lf
    ", B[0]/(1-A[0]));
    42     }
    43     return 0;
    44 }
  • 相关阅读:
    SPOJ 149 FSHEEP Fencing in the Sheep ( 计算几何 + 二分 )
    UVa 11806
    UVa 1445
    HDU 4725 The Shortest Path in Nya Graph( 建图 + 最短路 )
    HDU 4661 Message Passing ( 树DP + 推公式 )
    从远程库克隆库
    添加远程库
    远程仓库
    删除文件
    撤销修改
  • 原文地址:https://www.cnblogs.com/bfshm/p/4063623.html
Copyright © 2011-2022 走看看