확률 dp- Ilya and Escalator

2829 단어 dpcodeforce

제목.


cf518D는 대체적으로 n개인으로 구성된 대기열을 의미한다. 각 단위의 시간에 대기열 헤더는 대기열 확률이 p이거나 대기열을 나가지 않을 수 있다. 확률은 1-p이다. t단위의 시간에 대기열을 나가는 인원수에 대한 기대를 물었다.

사고의 방향


P{X=i}(0<=i<=t)를 계산할 수 있다면 이 문제를 해결할 수 있습니다.정답은
∑i=0nP{X=i}∗i
대상
P{X=i}
dp[i][j]를 설정하면 전 t단위 시간에 j 개인이 대기열에 나올 확률이 있음을 나타낸다.
그러면
dp[i+1][j+1] += dp[i][j] * P
dp[i+1][j] += dp[i][j] * (1 - P)
j>=n일 때 dp[i+1][j]+=dp[i][j]

코드

#include <cstring>
#include <stdio.h>
#include <algorithm>
using namespace std;

int N,T;
double P;
const int maxn = 2010;
double dp[maxn][maxn];
int main() {
    scanf("%d%lf%d",&N,&P,&T);
    for(int i = 0;i <= T;i ++) {
        for(int j = 0;j <= N;j ++) {
            dp[i][j] = 0.0;
        }
    }

    dp[0][0] = 1.0;
    for(int i = 0;i <= T;i ++) {
        for(int j = 0;j <= i;j ++) {
            if(j >= N) {
                dp[i+1][j] += dp[i][j];
                continue; 
            }

            dp[i+1][j+1] += dp[i][j] * P;
            dp[i+1][j] += dp[i][j] * (1 - P);
        }
    }

    double ret = 0.0;
    for(int i = 1;i <= N;i ++) {
        ret += dp[T][i] * i;
    }

    printf("%f
"
,ret); }

좋은 웹페이지 즐겨찾기