【Luogu】P3239亚瑟王(概率DP)
请看luogu第一篇题解
#include<cstdio> #include<algorithm> #include<cstring> #include<cctype> #include<cstdlib> #include<cmath> #define maxn 300 using namespace std; double f[maxn][maxn]; double g[maxn]; double p[maxn]; double s[maxn]; int main(){ int T; scanf("%d",&T); while(T--){ memset(f,0,sizeof(f)); memset(g,0,sizeof(g)); int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) scanf("%lf%lf",&p[i],&s[i]); g[1]=1-pow(1-p[1],m); f[1][0]=1-g[1]; f[1][1]=g[1]; for(int i=2;i<=n;++i) for(int j=0;j<=min(i,m);++j){ if(j) f[i][j]+=f[i-1][j-1]*(1-pow(1-p[i],m-j+1)); if(i^j) f[i][j]+=f[i-1][j]*pow(1-p[i],m-j); } for(int i=2;i<=n;++i) for(int j=0;j<=min(i-1,m);++j) g[i]+=f[i-1][j]*(1-pow(1-p[i],m-j)); double ans=0; for(int i=1;i<=n;++i) ans+=g[i]*s[i]; printf("%.10lf\n",ans); } return 0; }