亚瑟王

神一般的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 
View Code

 

posted @ 2016-01-01 20:32  Ngshily  阅读(156)  评论(0编辑  收藏  举报