题意:36张扑克,平分成9摞,两张数字一样的可以拿走,每次随机拿两张,问能拿光的概率。

解法:记忆化搜索,状态压缩。一开始我想在还没拿的时候概率是1,然后往全拿光推···样例过不去···后来觉得推反了,改成了深搜,模拟拿牌的过程,九摞牌的状态用9位五进制表示。

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
double dp[2000000];
int vis[2000000];
char card[9][5][3];
double dfs(int n)
{
if(n == 0)
return 1.0;
if(vis[n])
return dp[n];
vis[n] = 1;
int a[10];
int tmp = n;
for(int i = 0; i < 9; i++)
{
a[i] = tmp % 5;
tmp /= 5;
}
int cnt = 0;
for(int i = 0; i < 9; i++)
for(int j = i + 1; j < 9; j++)
if(a[i] && a[j] && card[i][a[i]][0] == card[j][a[j]][0])
{
//cout << "i = " << i << " j = " << j << endl;
tmp = 0;
for(int k = 8; k >= 0; k--)
{
tmp *= 5;
if(k == i || k == j)
tmp += a[k] - 1;
else
tmp += a[k];
}
dp[n] += dfs(tmp);
cnt++;
}
if(cnt)
dp[n] /= (double)cnt;
return dp[n];
}
int main()
{
while(~scanf("%s", card[0][1]))
{
for(int i = 2; i < 5; i++)
scanf("%s", card[0][i]);
for(int i = 1; i < 9; i++)
for(int j = 1; j < 5; j++)
scanf("%s", card[i][j]);
memset(dp, 0, sizeof(dp));
memset(vis, 0, sizeof(vis));
double ans = dfs(1953124);
printf("%.6lf\n", ans);
}
return 0;
}

UVA 1637 Double Patience的更多相关文章

  1. UVa 1637 - Double Patience(概率DP)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. POJ2794 Double Patience[离散概率 状压DP]

    Double Patience Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 694   Accepted: 368 Cas ...

  3. UVa 1637 (概率) Double Patience

    题意: 一共有9堆牌,每堆牌四张.每次可以取堆顶点数相同的两张牌,如果有多种方案则选取是随机的. 如果最后将所有牌取完,则视为游戏胜利,求胜利的概率. 分析: 用一个九元组表示状态,分别代表每堆牌剩余 ...

  4. ●POJ 2794 Double Patience

    题链: http://poj.org/problem?id=2794题解: 状压DP,概率 9元组表示每一堆还剩几张牌.可以用5进制状压,共5^9=1953124个状态. 令P(S)表示S这个状态被取 ...

  5. UVa 1637 纸牌游戏(全概率公式)

    https://vjudge.net/problem/UVA-1637 题意: 36张牌分成9堆,每堆4张牌.每次可以拿走某两堆顶部的牌,但需要点数相同.每种拿法的概率均为1/5.求成功概率. 思路: ...

  6. ACM学习历程——UVA 127 "Accordian" Patience(栈;模拟)

    Description  ``Accordian'' Patience  You are to simulate the playing of games of ``Accordian'' patie ...

  7. UVa 170 - Clock Patience

    题目:Clock Patience游戏,将52张扑克牌,按时钟依次分成13组(中心一组),每组4张全都背面向上, 从中间组最上面一张牌開始.翻过来设为当前值,然后取当前值相应组中最上面的背过去的牌翻过 ...

  8. 紫书 例题 10-12 UVa 1637(概率计算)

    以9元组来代表当前状态,每一元是每一堆剩下的牌数 枚举当前状态所有可以拿掉牌的情况,然后递归下去求 概率,当牌拿完的时候概率为1 那么这里的实现非常的秀,用到了vector来代表9元组 然后还用到了m ...

  9. UVA 12821 Double Shortest Paths

    Double Shortest PathsAlice and Bob are walking in an ancient maze with a lot of caves and one-way pa ...

随机推荐

  1. 类似nike+、香蕉打卡的转场动画效果-b

    首先,支持并感谢@wazrx 的 http://www.jianshu.com/p/45434f73019e和@onevcat 的https://onevcat.com/2013/10/vc-tran ...

  2. swift基础--字符串

    (1)遍历 (2)长度 (3)拼接 (4)插值 (5)大小写 (6)trim (7)split ……等等 var a = "你好" var b = String() a.isEmp ...

  3. [转载]jQuery 1.9 移除了 $.browser 的替代方法获取浏览器类型

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support . 在更新的 2.0 版本中,将不再支持 IE 6/7/8. ...

  4. jsp request.getParameterValues获取数组值代码示例

    tt.jsp <form action="tt2.jsp" method="POST"> <select name="two&quo ...

  5. Maven SDK

    Maven SDK  Details Print   Tags: development maven maven2 liferay v6.0 Table of Contents [-] Introdu ...

  6. Grok debugger

    http://www.cnblogs.com/vovlie/p/4227027.html http://it.taocms.org/10/5802.htm

  7. 用QT创建新风格: QStyle

    转贴: http://hi.baidu.com/yjj2008/blog/item/6cd4a1892ef0d4b60f2444a5.html 本文介绍了如何使用qt提供的接口来设计自己的GUI风格( ...

  8. python string 连接test

    def strTest(): name = "" for i in range(10): name += "hello" #print name def str ...

  9. IntelliJ idea 中使用Git

    1.要使用GitHub,首先你需要下载一个Git(地址:http://windows.github.com/)这里使用的是for Windows,然后安装完成会得到如下的一个目录:

  10. Android 使用split函数进行多个空格分割

    在项目中经常会遇到按字符分割字符串的情况,可以使用String对象的split函数进行分割. 先看实际情况: String str = "关键词1 关键词2 关键词3"; Stri ...