神一般的DP,f[i][j]表示前i张牌,还剩j轮的概率
对于第i张,如果它在后j轮中都没有被出出去,则有f[i+1][j]<--f[i][j]*(1-p[i])^j
如果它被出出去了,则有f[i+1][j-1]<--f[i][j]*(1-(1-p[i])^j)
边界条件f[0][r]=1
由于f[i][ ]只对f[i+1][ ]有影响,所以转移的顺序无所谓,但由于我们有对(1-p[i])^j的计算,所以j:1-->r会比较快,233
1 #include<bits/stdc++.h> 2 using namespace std; 3 double f[250][150],p[250]; 4 int d[250]; 5 int main(){ 6 int T; 7 scanf("%d",&T); 8 while(T--){ 9 int n,r; 10 scanf("%d%d",&n,&r); 11 for(int i=1;i<=n;i++) 12 scanf("%lf%d",&p[i],&d[i]); 13 memset(f,0,sizeof(f)); 14 f[1][r]=1; 15 double ans=0; 16 for(int i=1;i<=n;i++){ 17 double pw=1; 18 for(int j=1;j<=r;j++){ 19 pw*=1-p[i]; 20 f[i+1][j]+=f[i][j]*pw; 21 f[i+1][j-1]+=f[i][j]*(1-pw); 22 ans+=f[i][j]*(1-pw)*d[i]; 23 } 24 } 25 printf("%.10lf\n",ans); 26 } 27 return 0; 28 } 29
时间: 2024-12-09 21:52:57