확률 dp/추정 공식

4779 단어 dp
확률 문제.공식
추상적으로 나온 제목의 대의:
n개의 작은 공이 있고, 놓인 공이 있으면 m번 뽑힌 공의 개수에 대한 기대를 물어본다.
dp는 두 가지 상태를 유지하고 i번에 꺼낸 것은 꺼낸 적이 없는 공의 확률 dp[i]와 꺼낸 것은 이미 꺼낸 공의 확률 np[i]를 유지한다.
만약에 i-1번에 꺼낸 것이 이미 꺼낸 공이라면 i번에 꺼낸 적이 없는 공의 확률은 dp[i-1]이다.
반대로 dp[i-1]-1/n(빼내지 않은 공이 하나 없어졌다)
그래서 상태 이동 방정식 dp[i]=dp[i-1]*(dp[i-1]-1/n)+np[i-1]*dp[i-1]를 얻을 수 있다.
공식을 미룰 수도 있다.그러나 나는 여전히 공식을 인품에 의존해야 한다고 생각한다. yy가 나올 수 있다면 당연히 매우 좋은 것이다...
코드:
 
#include <iostream>

#include <stdio.h>

#include<string.h>

#include<algorithm>

#include<string>

#include<math.h>

#include<ctype.h>

using namespace std;

#define MAXN 10000

int n,m;

double dp[100010];

double np[100010];

double solve()

{

    double res=0;

    memset(dp,0,sizeof(dp));

    memset(np,0,sizeof(np));

    dp[1]=1;

    np[1]=0;

    for(int i=2;i<=m;i++)

    {

        dp[i]=dp[i-1]*(dp[i-1]-1.0/(double)n)+np[i-1]*dp[i-1];

        np[i]=1-dp[i];

    }

    for(int i=1;i<=m;i++)

    {

        res+=dp[i];

    }

    return res;

}

int main()

{

    while(scanf("%d%d",&n,&m)!=EOF)

    {

        printf("%.10lf
",solve()); } return 0; }

공식.
#include <stdio.h>

#include<math.h>

double n,m;

int main()

{

    while(scanf("%lf%lf",&n,&m)!=EOF)

    {

        printf("%.10lf
",n-n*pow(((n-1)/n),m)); } return 0; }

좋은 웹페이지 즐겨찾기