POJ 2096 【期望DP】

题意:

有n种选择,每种选择对应m种状态。每种选择发生的概率相等,每种选择中对应的每种状态发生的概率相等。

求n种选择和m种状态中每种至少发生一次的期望。

期望DP好别扭啊。要用倒推的方法。

dp[i][j]表示已经发生了i种选择,j种状态。

那么由dp[n][m]这个时刻到最终时刻的期望是0.

而我们的起始时刻是dp[0][0]。

而dp[i][j]可以转移到四种情况,

1 dp[i][j]本身

2 dp[i+1][j]

3 dp[i][j+1]

4 dp[i+1][j+1]

那么dp[i][j]表示的期望是他能够转移到别的所有的情况的期望乘其权值的和。

好的。这大概就是期望DP的精髓了...

#include<stdio.h>
#include<string.h>
double dp[1005][1005];
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    memset(dp,0,sizeof(dp));
    for(int i=n;i>=0;i--)
    {
        for(int j=m;j>=0;j--)
        {
            if(i!=n||j!=m)
            dp[i][j]=(dp[i][j+1]*(m-j)*i/((double)(m*n))+dp[i+1][j]*(n-i)*j/((double)(m*n))+dp[i+1][j+1]*(n-i)*(m-j)/((double)(m*n))+1)/((double)(1-((double)(i*j))/(m*n)));
        }
    }
    printf("%.4lf
",dp[0][0]);
}
原文地址:https://www.cnblogs.com/tun117/p/5056987.html