UVa1637
来源:互联网 发布:南京奥派软件 编辑:程序博客网 时间:2024/05/24 01:01
题目链接
简介:
有九堆poker,每堆4张,每次从任意两堆的顶部选两张相同花色的拿走
都拿走就胜利了,问胜利的概率:
分析:
用九元组表示当前状态(每一队还剩下多少张牌)
d[i]表示状态i获胜的概率
由全概率概率公式可以得到,d[i]就等于ta所有后继状态获胜的平均值
tip
当前状态若没有后继状态时,d[i]=0
不然会发生运算溢出
数组清零
//这里写代码片#include<cstdio>#include<cstring>#include<iostream>using namespace std;int poker[10][5];char s[5];bool vis[5][5][5][5][5][5][5][5][5];double f[5][5][5][5][5][5][5][5][5];int n[10];int get(char *s){ switch(s[0]) { case 'A': return 1; case 'K': return 13; case 'J': return 11; case 'Q': return 12; case 'T': return 10; default: return s[0]-'0'; }}int read(){ for (int i=1;i<=9;i++) for (int j=1;j<=4;j++) { if (scanf("%s",&s)!=1) return 0; poker[i][j]=get(s); } return 1;}double dp(int *n,int c){ if (!c) return 1.0; if (vis[n[1]][n[2]][n[3]][n[4]][n[5]][n[6]][n[7]][n[8]][n[9]]) return f[n[1]][n[2]][n[3]][n[4]][n[5]][n[6]][n[7]][n[8]][n[9]]; vis[n[1]][n[2]][n[3]][n[4]][n[5]][n[6]][n[7]][n[8]][n[9]]=1; double ans=0; int tt=0; for (int i=1;i<=9;i++) if (n[i]) for (int j=i+1;j<=9;j++) if (n[j]&&poker[i][n[i]]==poker[j][n[j]]) { tt++; n[i]--; n[j]--; ans+=dp(n,c-2); n[i]++; n[j]++; } if (!tt) ans=0; //这种状态下不能成功 else ans/=tt; f[n[1]][n[2]][n[3]][n[4]][n[5]][n[6]][n[7]][n[8]][n[9]]=ans; return ans;}int main(){ while (read()) { memset(vis,0,sizeof(vis)); memset(f,0,sizeof(f)); for (int i=1;i<=9;i++) n[i]=4; printf("%0.6lf\n",dp(n,36)); } return 0;}
阅读全文
0 0
- UVa1637
- [UVA1637]Double Patience && 概率
- uva1637 Double Patience
- UVa1637 - Double Patience(离散概率)
- uva1637(记忆化搜索)
- uva1637 Double Patience 概率,记忆化搜索
- 例10-12 *uva1637(概率dp)
- uva1637(记忆化搜索,离散概率)
- 【概率】Double Patience, NEERC 2005, UVa1637
- UVa1637纸牌游戏(紫书327)
- uva1637 概率dp(记忆化搜索)
- Solr的安装配置
- [BZOJ4518][SDOI2016]征途(斜率优化DP)
- Ubuntu,python 3默认修改
- 英语之冠词规则
- 【LeetCode】684. Redundant Connection
- UVa1637
- R语言之函数与包
- u-boot-2017.07移植到S5PV210单板
- GIT学习笔记(3)
- git add -u与-A .三者的区别
- 跟我一起学Keras之实例篇(2)
- WebView基础三:WebView优化
- 深入理解java虚拟机—虚拟机字节码执行引擎
- bzoj 3036(期望dp)