zoukankan      html  css  js  c++  java
  • poj 2151 概率dp

    注意递推过程中的顺序

    题意:
    ACM比赛中,共M道题,T个队,pij表示第i队解出第j题的概率
    问 每队至少解出一题且冠军队至少解出N道题的概率。

    解析:DP
    设dp[i][j][k]表示第i个队在前j道题中解出k道的概率
    则:
    dp[i][j][k]=dp[i][j-1][k-1]*p[j][k]+dp[i][j-1][k]*(1-p[j][k]);
    先初始化算出dp[i][0][0]和dp[i][j][0];
    设s[i][k]表示第i队做出的题小于等于k的概率
    则s[i][k]=dp[i][M][0]+dp[i][M][1]+``````+dp[i][M][k];

    则每个队至少做出一道题概率为P1=(1-s[1][0])*(1-s[2][0])*```(1-s[T][0]);
    每个队做出的题数都在1~N-1的概率为P2=(s[1][N-1]-s[1][0])*(s[2][N-1]-s[2][0])*```(s[T][N-1]-s[T][0]);

    最后的答案就是P1-P2

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<queue>
     7 #include<map>
     8 using namespace std;
     9 #define MOD 1000000007
    10 const double eps=1e-5;
    11 #define cl(a) memset(a,0,sizeof(a))
    12 #define ts printf("*****
    ");
    13 const int MAXN=1015;
    14 int n,m,tt,t;
    15 double p[MAXN][50],s[MAXN][MAXN],dp[MAXN][50][50];
    16 int main()
    17 {
    18     int i,j,k;
    19     #ifndef ONLINE_JUDGE
    20     freopen("1.in","r",stdin);
    21     #endif
    22     while(scanf("%d%d%d",&m,&t,&n)!=EOF)
    23     {
    24         if(n==0&&m==0&&t==0)    break;
    25         for(i=1;i<=t;i++)
    26         {
    27             for(j=1;j<=m;j++)
    28                 scanf("%lf",&p[i][j]);
    29         }
    30         for(i=1;i<=t;i++)
    31         {
    32             dp[i][0][0]=1;
    33             for(j=1;j<=m;j++)    dp[i][j][0]=dp[i][j-1][0]*(1-p[i][j]);
    34             for(j=1;j<=m;j++)
    35                 for(k=1;k<m;k++)
    36                 {
    37                     dp[i][j][k]=dp[i][j-1][k-1]*p[i][j]+dp[i][j-1][k]*(1-p[i][j]);
    38                 }
    39             s[i][0]=dp[i][m][0];
    40             for(int k=1;k<=m;k++)s[i][k]=s[i][k-1]+dp[i][m][k];
    41         }
    42         double P1=1;
    43         double P2=1;
    44         for(int i=1;i<=t;i++)
    45         {
    46             P1*=(1-s[i][0]);
    47             P2*=(s[i][n-1]-s[i][0]);
    48         }
    49         printf("%.3lf
    ",P1-P2);
    50     }
    51 }
  • 相关阅读:
    优先队列
    Problem W UVA 662 二十三 Fast Food
    UVA 607 二十二 Scheduling Lectures
    UVA 590 二十一 Always on the run
    UVA 442 二十 Matrix Chain Multiplication
    UVA 437 十九 The Tower of Babylon
    UVA 10254 十八 The Priest Mathematician
    UVA 10453 十七 Make Palindrome
    UVA 10163 十六 Storage Keepers
    UVA 1252 十五 Twenty Questions
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4416223.html
Copyright © 2011-2022 走看看