题意:
有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]); }