Double Patience UVA
来源:互联网 发布:c语言左移和右移 编辑:程序博客网 时间:2024/05/16 05:09
题目传送门
题意:36张牌分成9堆,每堆4张牌,每一次可以拿走顶部两个相同点数的牌,如果有多种方法则按照等概率的随机拿,如果最后拿走了所有的牌则胜利,求胜利的概率。
思路;用一个九元组储存状态,进行记忆话搜索。
#include <algorithm>#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <list>#include <map>#include <queue>#include <set>#include <stack>#include <string>#include <vector>#define MAXN 110#define MAXE 5#define INF 1000000000#define MOD 10007#define LL long long#define ULL unsigned long long#define pi 3.14159using namespace std;double dp[MAXE][MAXE][MAXE][MAXE][MAXE][MAXE][MAXE][MAXE][MAXE];bool vis[MAXE][MAXE][MAXE][MAXE][MAXE][MAXE][MAXE][MAXE][MAXE];vector<char> p[MAXN];double dfs(int num1, int num2, int num3, int num4, int num5, int num6, int num7, int num8, int num9) { if (vis[num1][num2][num3][num4][num5][num6][num7][num8][num9]) return dp[num1][num2][num3][num4][num5][num6][num7][num8][num9]; vis[num1][num2][num3][num4][num5][num6][num7][num8][num9] = true; int num[] = {num1, num2, num3, num4, num5, num6, num7, num8, num9}; bool flag = false; double &ans = dp[num1][num2][num3][num4][num5][num6][num7][num8][num9]; for (int i = 0; i < 9; ++i) { if (num[i]) { flag = true; break; } } if (!flag) { return ans = 1; } int cnt = 0; for (int i = 0; i < 9; ++i) { if (!num[i]) continue; for (int j = i + 1; j < 9; ++j) { if (!num[j]) continue; if (p[i][num[i] - 1] == p[j][num[j] - 1]) { cnt++; num[i]--; num[j]--; ans += dfs(num[0], num[1], num[2], num[3], num[4], num[5], num[6], num[7], num[8]); num[i]++; num[j]++; } } } if (ans == 0) return ans = 0; return ans = ans / (double) cnt;}int main() { std::ios::sync_with_stdio(false); string str1, str2, str3, str4; while (cin >> str1 >> str2 >> str3 >> str4) { memset(dp, 0, sizeof(dp)); memset(vis, false, sizeof(vis)); memset(p, 0, sizeof(p)); p[0].push_back(str1[0]); p[0].push_back(str2[0]); p[0].push_back(str3[0]); p[0].push_back(str4[0]); for (int i = 1; i <= 8; ++i) { cin >> str1 >> str2 >> str3 >> str4; p[i].push_back(str1[0]); p[i].push_back(str2[0]); p[i].push_back(str3[0]); p[i].push_back(str4[0]); } printf("%.6f\n", dfs(4, 4, 4, 4, 4, 4, 4, 4, 4)); } return 0;}/* AS 9S 6C KS JC QH AC KH 7S QD JD KD QS TS JS 9H 6D TD AD 8S QC TH KC 8D 8C 9D TC 7C 9C 7H JH 7D 8H 6S AH 6H */
阅读全文
0 0
- UVA 1637 - Double Patience
- UVA 1637 Double Patience
- UVa 1637 Double Patience
- uva 1637 - Double Patience
- UVa 1637 Double Patience
- Double Patience UVA
- UVa 1637 Double Patience (搜索)
- UVA 1637 Double Patience 概率DP
- UVA 1637 Double Patience(DP+概率)
- [UVA1637]Double Patience && 概率
- Neerc2005 POJ2794 Double Patience
- uva1637 Double Patience
- UVa1637 - Double Patience(离散概率)
- UVa 127 "Accordian" Patience
- Uva Accordian Patience
- uva 127 - "Accordian" Patience
- uva 127 - "Accordian" Patience
- uva-127 - "Accordian" Patience
- Hibernate一对一注解,一对多注解
- 好好准备找工作
- this关键字的应用
- 【图论】有向无环图的拓扑排序
- 前端之ajax解析
- Double Patience UVA
- Caffe_Windows学习笔记(七)细粒度图像分类
- continue和break
- 类与对象第五题
- 输出一个某种编码的字符串
- 2017 乌鲁木齐赛区网络赛 Coconut(【模拟题目】)
- 209. Minimum Size Subarray Sum解题报告
- Noip 2016 蚯蚓
- a2dp