zoukankan      html  css  js  c++  java
  • HDU 4089 Activation

            概率dp,这种一个点作为起点,求到多点的概率或期望的都可以倒过来想。。。即让起点变为那多个点,终点(即答案)即为原来起点的值。

           dp[ i ][ 1 ] = p1 * dp[ i ][ 1 ] + p2 * dp[ i ][ i ] ---- (1);

           dp[ i ][ j ]  = p1 * dp[ i ][ i ]  + p2 * dp[ i ][ j - 1] + p3 * dp[ i - 1][ j - 1]  + (j <= k ? p4 : 0) ----- (2);   

           对(2)式递推下去,就可以结合(1)式得出dp[ i ][ 1]的值。。。然后递推即可,然后求得的dp[ n ][ m ] 即为所求。

           注意:p3 && p4 == 0 时要特判。。。

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #define LL long long
    #define CLR(a, b) memset(a, b, sizeof(a))
    
    using namespace std;
    const int N = 2002;
    const int MOD = 1e9 +7;
    
    double dp[2][N];
    
    int main()
    {
        int n, m , k, i, j;
        double p1, p2, p3, p4;
        while(scanf("%d%d%d%lf%lf%lf%lf", &n, &m, &k, &p1, &p2, &p3, &p4) != EOF)
        {
            if(p4 == 0) {puts("0.00000"); continue;}
            dp[1][1] = p4 / (1 - p1 - p2);
            double a = p2 / (1 - p1), b = p3 / (1 - p1), c = p4 / (1 - p1), tmp, d;
            for(i = 2; i <= n; i ++)
            {
                tmp = 0;d = a;
                for(j = 2; j <= i; j ++)
                {
                    tmp = tmp * a + dp[1 - (i & 1)][j - 1] * b + (j <= k ? c : 0.0) ;
                    d *= a;
                }
                tmp = tmp * a + c;
                dp[i & 1][1] = tmp / (1 - d);
                for(j = 2; j <= i; j ++)
                {
                    dp[i & 1][j] = dp[1 - (i & 1)][j - 1] * b + dp[i & 1][j - 1] * a + (j <= k ? c : 0.0);
                }
            }
            printf("%.5f
    ", dp[n & 1][m]);
        }
    }
    



  • 相关阅读:
    ajax请求跨域和表单重复提交解决方案
    HTTP请求(HttpClient和PostMan)
    HTTP协议
    Oracle学习整理(二)
    oracle学习整理(一)
    MySQL的慢查询日志
    mysql索引优化
    Explain
    打好太极拳科学压腿的方法
    太极拳的压腿基本功
  • 原文地址:https://www.cnblogs.com/james1207/p/3327595.html
Copyright © 2011-2022 走看看