概率DP
刚开始想简单了233……以为一个石子的时候都主动取,多余一个石子的时候都主动不取……感觉对博弈一无所知
正确姿势:记f[i]表示剩i个石子,先手胜概率,g[i],后手胜概率。事实上,有i个石子时的决策只跟f[i-1]和g[i-1]的大小有关。如果前者大,那双方都希望自己在下一轮充当先手,否则希望充当后手。根据这个来DP就行了。
事后打表发现取和不取的决策和当前石子的奇偶有关,interesting
#include<cstdio>
using namespace std;
namespace runzhe2000
{
double f[2], g[2];
void main()
{
int T; scanf("%d",&T);
for(; T--; )
{
int n, cur = 0; double p, q; scanf("%d%lf%lf",&n,&p,&q);
f[1] = 0; g[1] = 1; n > 1000 ? n = 1000 : 0;
for(int i = 1; i <= n; i++, cur ^= 1)
{
if(f[cur^1] > g[cur^1]) // 不取
{
f[cur] = (p*(1-q)*f[cur^1]+(1-p)*g[cur^1])/(1-p*q);
g[cur] = (q*(1-p)*g[cur^1]+(1-q)*f[cur^1])/(1-p*q);
}
else // 取
{
f[cur] = (p*g[cur^1]+(1-p)*q*f[cur^1])/(1-(1-q)*(1-p));
g[cur] = (q*f[cur^1]+(1-q)*p*g[cur^1])/(1-(1-q)*(1-p));
}
}
printf("%.6lf\n",f[cur^1]);
}
}
}
int main()
{
runzhe2000::main();
}