bzoj2318
概率dp,逆推
考虑已经知道
如果A想投正面,
这个转移可以理解为后继状态的贡献已经是知道的,现在有
解方程
然后,考虑由当前局面转移到后继状态时,想投正面与想投反面取决于接下来的状态
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1005
using namespace std;
int n,T;
double p,q,tmp;
double x,y;
double f[maxn],g[maxn];
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&T);
while(T--){
scanf("%d",&n);
n=min(n,1000);
scanf("%lf%lf",&p,&q);
f[0]=0.0; g[0]=1.0;
for(int i=1;i<=n;i++){
if(f[i-1]>g[i-1]) x=1-p,y=1-q;
else x=p,y=q;
f[i]=(x*g[i-1]+(1.0-x)*y*f[i-1])/(1.0-(1.0-x)*(1.0-y));
g[i]=(y*f[i-1]+(1.0-y)*x*g[i-1])/(1.0-(1.0-x)*(1.0-y));
}
printf("%0.6lf\n",f[n]);
}
//while(1);
return 0;
}