博客
关于我
POJ2794 Double Patience[离散概率 状压DP]
阅读量:794 次
发布时间:2023-03-03

本文共 1924 字,大约阅读时间需要 6 分钟。

为了计算George在Double Patience游戏中随机策略下赢的概率,我们可以采用动态规划和记忆化搜索的方法。以下是详细的解决方案:

方法思路

  • 状态表示:将每个堆的状态表示为五进制数,其中每一位表示该堆剩余卡片的位置(0到4)。
  • 动态规划:使用动态规划数组d,其中d[u]表示从状态u出发George赢的概率。
  • 状态转换:对于每个状态,检查所有可能的两堆配对,计算配对后的新状态,并递归计算新状态的赢概率。
  • 记忆化技术:使用一个数组存储已经计算过的状态结果,避免重复计算。
  • 初始状态:初始状态为所有九堆都有四张卡片,对应的五进制数为999999(即1953124)。
  • 解决代码

    #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/

    你可能感兴趣的文章
    POJ 2243 Knight Moves
    查看>>
    POJ 2262 Goldbach's Conjecture
    查看>>
    POJ 2362 Square DFS
    查看>>
    Qt笔记——解决添加Qt Designer Form Class时“allocation of incomplete type Ui::”
    查看>>
    poj 2386 Lake Counting(BFS解法)
    查看>>
    poj 2387 最短路模板题
    查看>>
    POJ 2391 多源多汇拆点最大流 +flody+二分答案
    查看>>
    POJ 2403
    查看>>
    poj 2406 还是KMP的简单应用
    查看>>
    POJ 2431 Expedition 优先队列
    查看>>
    Qt笔记——获取位置信息的相关函数
    查看>>
    POJ 2484 A Funny Game(神题!)
    查看>>
    POJ 2486 树形dp
    查看>>
    POJ 2488:A Knight&#39;s Journey
    查看>>
    SpringBoot为什么易学难精?
    查看>>
    poj 2545 Hamming Problem
    查看>>
    poj 2723
    查看>>
    poj 2763 Housewife Wind
    查看>>
    Qt笔记——模型/视图MVD 文件目录浏览器软件
    查看>>
    POJ 2892 Tunnel Warfare(树状数组+二分)
    查看>>