概率题。。可以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\n",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-n*pow(((n-1)/n),m)); } return 0; }
时间: 2024-10-24 17:18:17