UVA1637Double Patience(概率 + 记忆化搜索)
2016-06-03 17:04
162 查看
训练指南P327
题意:36张牌分成9堆, 每堆4张牌。每次拿走某两堆顶部的牌,但需要点数相同。如果出现多种拿法则等概率的随机拿。 如果最后拿完所有的牌则游戏成功,求成功的概率。
开个9维数组表示每一堆的状态,模拟搜索一下
View Code
题意:36张牌分成9堆, 每堆4张牌。每次拿走某两堆顶部的牌,但需要点数相同。如果出现多种拿法则等概率的随机拿。 如果最后拿完所有的牌则游戏成功,求成功的概率。
开个9维数组表示每一堆的状态,模拟搜索一下
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int Max = 6; char s[Max][Max]; int A[10][Max * Max]; int vis[Max][Max][Max][Max][Max][Max][Max][Max][Max]; double d[Max][Max][Max][Max][Max][Max][Max][Max][Max]; double dfs(int s1, int s2, int s3, int s4, int s5, int s6, int s7, int s8, int s9) { if (vis[s1][s2][s3][s4][s5][s6][s7][s8][s9]) return d[s1][s2][s3][s4][s5][s6][s7][s8][s9]; vis[s1][s2][s3][s4][s5][s6][s7][s8][s9] = 1; int T[10] = {0, s1, s2, s3, s4, s5, s6, s7, s8, s9}; bool flag = true; for (int i = 1; i <= 9; i++) { if (T[i]) { flag = false; break; } }//如果全是0,表示结束,这个状态为1 if (flag) { return d[s1][s2][s3][s4][s5][s6][s7][s8][s9] = 1.0; } int tot = 0; double cnt = 0; for (int i = 1; i <= 9; i++) { for (int j = i + 1; j <= 9; j++) { if (T[i] > 0 && T[j] > 0 && A[i][ T[i] ] == A[j][ T[j] ]) { T[i]--; T[j]--; tot++; // 当前有几种选择方案 cnt += dfs(T[1], T[2], T[3], T[4], T[5], T[6], T[7], T[8], T[9]); // 选择 i 堆 和 j 堆之后剩下的全部取光的概率 T[i]++; T[j]++; } } } if (tot > 0) d[s1][s2][s3][s4][s5][s6][s7][s8][s9] = cnt / (1.0 * tot); // (1 / tot ) * cnt;当前状态概率 return d[s1][s2][s3][s4][s5][s6][s7][s8][s9]; } int main() { while (scanf("%s%s%s%s", s[1], s[2], s[3], s[4]) != EOF) { for (int i = 1; i <= 4; i++) A[1][i] = s[i][0] - '0'; // A[i][j]用于记录第i堆第j个 for (int i = 2; i <= 9; i++) { for (int j = 1; j <= 4; j++) { scanf("%s", s[j]); A[i][j] = s[j][0] - '0'; } } memset(vis, 0, sizeof(vis)); memset(d, 0, sizeof(d)); dfs(4, 4, 4, 4, 4, 4, 4, 4, 4); // 所有的堆都是4个开始搜索 printf("%.6lf\n", d[4][4][4][4][4][4][4][4][4]); } return 0; }
View Code
相关文章推荐
- iOS设置圆角的几种方式
- mybatis 中 foreach collection的三种用法
- Servlet建立一个图片验证码程序
- mingw 编译 boost出错解决办法
- 从头到尾彻底理解傅里叶变换算法(上)
- XlLineStyle 枚举 (Excel)
- Android Studio 使用中的相关“Bug”记录
- c#泛型结合Linq实现从数据源中截取指定位置,行数的数据
- hdu 1021 Fibonacci Again 找规律
- 成员变量作为成员函数的默认参数
- 21、Dom元素的灵活查找--通过className条件筛选
- 字符串转化为Date兼容性问题
- 欢迎使用CSDN-markdown编辑器
- 卡顿检测---来自老谭
- 似然函数的理解
- 如何在googleplay上发布应用?
- React Native第一个Demo(1)
- 一个用x86汇编编写的、页式管理、图形化的CS -- Boot篇
- 软件工程课程建议
- 异步方法不能使用ref和out的解决方法