bzoj 4008 [HNOI2015]亞瑟王 期望dp

先考慮這麼一個式子:
Pr22=Pr21Pr12Pr2 其中Pr表示概率。
這個式子是錯的,因爲 第1次不選2和第2次不選1的概率不是獨立的。
所以直接算的方法gg了。
f[i][j] 表示前i個點有j個被選過的概率。
g[i] 表示點i被選的概率。
那麼枚舉前i-1個點被選的個數j,
g[i]+=f[i1][j](1(1p[i])rj)
f[i][j]+=f[i1][j](1p[i])rj
f[i][j+1]+=f[i1][j](1(1p[i])rj)

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章