本文共 1924 字,大约阅读时间需要 6 分钟。
为了计算George在Double Patience游戏中随机策略下赢的概率,我们可以采用动态规划和记忆化搜索的方法。以下是详细的解决方案:
d,其中d[u]表示从状态u出发George赢的概率。#include#include #include #include #include using namespace std;const int N = 1953125;const string suits = "SCDHH";const string ranks = "A23456789TJQK";int c[10][5] = {}; // c[i][j] 表示第i堆在第j层的卡的花色int s[5] = {}; // s[i] 表示第i堆的卡的顺序int M = 1953124; // 初始状态vector a(10); // 用于转换状态到五进制数int compute_state(int u) { for (int i = 1; i <= 9; ++i) { a[i] = 0; } for (int i = 9; i >= 1; --i) { int t = u / (int)pow(5, 9 - i); a[i] = t % 5; u /= (int)pow(5, 9 - i); } return a;}double dp(int u) { static vector d(N, -1); if (d[u] != -1) return d[u]; d[u] = 1.0; vector > pairs; for (int i = 1; i <= 9; ++i) { for (int j = i + 1; j <= 9; ++j) { if (c[i][a[i]] == c[j][a[j]]) { pairs.emplace_back(i, j); } } } if (pairs.empty()) { d[u] = 0.0; return d[u]; } int cnt = pairs.size(); for (auto& p : pairs) { int i = p.first; int j = p.second; int t = 0; for (int k = 9; k >= 1; --k) { t = t * 5; if (k == i || k == j) { t += a[k] - 1; } else { t += a[k]; } } t /= 5; d[u] += dp(t); } if (cnt) { d[u] /= cnt; } else { d[u] = 0.0; } return d[u];}int main() { for (int i = 1; i <= 9; ++i) { for (int j = 1; j <= 4; ++j) { string card; card += s[i]; card += c[i][j]; c[i][j] = card[1]; } } d[M] = 1.0; cout << fixed << setprecision(6) << dp(M); return 0;}
compute_state将当前状态转换为各个堆的卡片位置,以便进行状态处理。dp:递归计算每个状态的赢概率,检查所有可能的两堆配对,递归计算配对后的新状态的赢概率,并取平均。d:用于存储已经计算的状态结果,避免重复计算,提高效率。main:初始化卡片信息,调用dp函数计算初始状态的赢概率,并输出结果。通过上述方法,可以高效地计算George在Double Patience游戏中随机策略下赢的概率,结果精确到小数点后6位。
转载地址:http://qdxfk.baihongyu.com/