#include <bits/stdc++.h>
using namespace std;
double dp[2][3][4][19][28][28];//状态分别是(轮次)(最上层数)(第二层状态)(A状态个数)(B状态个数)(C状态个数),D状态个数和高度可以算出来
bool vis[2][3][4][19][28][28];
double ba1, da1, ba2, da2, ba3, da3;
double bc1, dc1, bc2, dc2, bc3, dc3;
int n;
double dfs(int flor, int top, int below, int a, int b, int c){
if(vis[flor][top-1][below][a][b][c])return dp[flor][top-1][below][a][b][c];
vis[flor][top-1][below][a][b][c]=true;
int bn=0;
if(below==0)bn=3;
else if(below==1)bn=2;
else if(below==2)bn=2;
else bn=1;
int d=n*3-top-bn-a*3-b*2-c*2;
int h=a+b+c+d+2;
double M=0;
double p1, p2, p3;
if(flor==0){
p1=ba1-da1*h;
p2=ba2-da2*h;
p3=ba3-da3*h;
}
else {
p1=bc1-dc1*h;
p2=bc2-dc2*h;
p3=bc3-dc3*h;
}
if(p1>1)p1=1;
if(p1<0)p1=0;
if(p2>1)p2=1;
if(p2<0)p2=0;
if(p3>1)p3=1;
if(p3<0)p3=0;
if(top==3){
if(below==0)a++;
if(below==2)c++;
if(a){
if(M<p1)M=max(M, (p1)*(1-dfs(flor^1, 1, 0, a-1, b+1, c)));
if(M<p2)M=max(M, (p2)*(1-dfs(flor^1, 1, 0, a-1, b, c+1)));
}
if(c){
if(M<p3)M=max(M, (p3)*(1-dfs(flor^1, 1, 0, a, b, c-1)));
}
if(below==0)a--;
if(below==2)c--;
}
else {
if(a){
if(M<p1)M=max(M, (p1)*(1-dfs(flor^1, top+1, below, a-1, b+1, c)));
if(M<p2)M=max(M, (p2)*(1-dfs(flor^1, top+1, below, a-1, b, c+1)));
}
if(c){
if(M<p3)M=max(M, (p3)*(1-dfs(flor^1, top+1, below, a, b, c-1)));
}
}
return dp[flor][top-1][below][a][b][c]=M;
}
int main()
{
int T;
scanf("%d", &T);
while(T--){
cin>>n;
cin>>ba1>>da1>>ba2>>da2>>ba3>>da3>>bc1>>dc1>>bc2>>dc2>>bc3>>dc3;
memset(dp, 0, sizeof(dp));
memset(vis, false, sizeof(vis));
double ans=dfs(0, 3, 0, n-2, 0, 0);
printf("%.4f\n", ans);
}
}
2010 成都Regional H 博弈,概率dp
最新推荐文章于 2021-12-16 15:35:48 发布