先考虑这么一个式子:
Pr第2次选2=Pr第2次不选1∗Pr第1次不选2∗Pr选2 其中Pr表示概率。
这个式子是错的,因为 第1次不选2和第2次不选1的概率不是独立的。
所以直接算的方法gg了。
设f[i][j] 表示前i个点有j个被选过的概率。
g[i] 表示点i被选的概率。
那么枚举前i-1个点被选的个数j,
g[i]+=f[i−1][j]∗(1−(1−p[i])r−j)
f[i][j]+=f[i−1][j]∗(1−p[i])r−j
f[i][j+1]+=f[i−1][j]∗(1−(1−p[i])r−j)
#include <bits/stdc++.h>
using namespace std;
#define N 230
int T,n,r;
double p[N],d[N],f[N][N],ans;
double qpow(double x,int y)
{
double ret=1;
while(y)
{
if(y&1)ret=ret*x;
x=x*x;y>>=1;
}
return ret;
}
int main()
{
//freopen("tt.in","r",stdin);
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&r);ans=0;
for(int i=1;i<=n;i++)
scanf("%lf%lf",&p[i],&d[i]);
memset(f,0,sizeof(f));
f[0][0]=1;
for(int i=1;i<=n;i++)
{
double sum=0;
for(int j=0;j<i&&j<=r;j++)
{
double t=1-qpow(1-p[i],r-j);
sum+=f[i-1][j]*t;
f[i][j]+=f[i-1][j]*(1-t);
f[i][j+1]+=f[i-1][j]*t;
}
ans+=sum*d[i];
}
printf("%.10f\n",ans);
}
return 0;
}
本文介绍了一种使用动态规划解决概率计算问题的方法。通过定义状态转移方程来更新每个节点被选择的概率,并最终求得所有可能的选择组合下,特定条件出现的期望值。
1541

被折叠的 条评论
为什么被折叠?



