题链:

http://poj.org/problem?id=2794
题解:

状压DP,概率
9元组表示每一堆还剩几张牌。可以用5进制状压,共5^9=1953124个状态。
令P(S)表示S这个状态被取完的概率。

假设当前状态为S,可以有三种取法,分别对应转移到_S1,_S2,_S3三个更小的状态。
那么由全概率公式:
如果_S1状态为前提条件,那么S就有1/3的概率转移到_S1
同理_S2,_S3。所以得出:
P(S)=P(S|_S1)*P(_S1)+P(S|_S2)*P(_S2)+P(S|_S3)*P(_S3)
由于P(S|_S1=)P(S|_S2)=P(S|_S3)=1/3
所以P(S)=(P(_S1)+P(_S2)+P(_S3))/3

即每个状态的概率为其后继状态的平均值。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char card[10][5];
bool vis[2000000];
double dp[2000000];
int code(int *a){
static int s; s=0;
for(int i=9;i>=1;i--)
s=s*5+a[i];
return s;
}
void decode(int s,int *a){
for(int i=1;i<=9;i++)
a[i]=s%5,s/=5;
}
double DP(int s){
if(vis[s]) return dp[s];
vis[s]=1;
int a[10],cnt=0; decode(s,a);
for(int i=1;i<=9;i++)
for(int j=i+1;j<=9;j++){
if(!a[i]||!a[j]||card[i][a[i]]!=card[j][a[j]]) continue;
a[i]--; a[j]--; cnt++;
int _s=code(a);
dp[s]+=DP(_s);
a[i]++; a[j]++;
}
if(cnt) dp[s]/=cnt;
return dp[s];
}
int main(){
static char S[5];
for(int i=1;i<=9;i++)
for(int j=1;j<=4;j++)
scanf("%s",S),card[i][j]=S[0];
vis[0]=1; dp[0]=1;
printf("%.6lf\n",DP(1953124));
return 0;
}

  

●POJ 2794 Double Patience的更多相关文章

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

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

  2. POJ 3481 Double Queue STLmap和set新学到的一点用法

    2013-08-08 POJ 3481  Double Queue 这个题应该是STL里较简单的吧,用平衡二叉树也可以做,但是自己掌握不够- -,开始想用两个优先队列,一个从大到小,一个从小到大,可是 ...

  3. poj 3841 Double Queue (AVL树入门)

    /****************************************************************** 题目: Double Queue(poj 3481) 链接: h ...

  4. POJ 3481 Double Queue(Treap模板题)

    Double Queue Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15786   Accepted: 6998 Des ...

  5. Uva 127 poj 1214 `Accordian'' Patience 纸牌游戏 模拟

    Input Input data to the program specifies the order in which cards are dealt from the pack. The inpu ...

  6. UVa 1637 (概率) Double Patience

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

  7. UVA 1637 Double Patience

    题意:36张扑克,平分成9摞,两张数字一样的可以拿走,每次随机拿两张,问能拿光的概率. 解法:记忆化搜索,状态压缩.一开始我想在还没拿的时候概率是1,然后往全拿光推···样例过不去···后来觉得推反了 ...

  8. POJ 3481 Double Queue

    平衡树.. 熟悉些fhq-Treap,为啥我在poj读入优化不能用啊 #include <iostream> #include <cstdio> #include <ct ...

  9. POJ 3481 Double Queue(STL)

    题意  模拟银行的排队系统  有三种操作  1-加入优先级为p 编号为k的人到队列  2-服务当前优先级最大的   3-服务当前优先级最小的  0-退出系统 能够用stl中的map   由于map本身 ...

随机推荐

  1. 201621123043 《Java程序设计》第8周学习总结

    1. 本周学习总结 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 contains的源代码如下 public boolean contain ...

  2. TOTP算法 基于时间的一次性密码

    /** Copyright (c) 2011 IETF Trust and the persons identified as authors of the code. All rights rese ...

  3. caffe使用ctrl-c不能保存模型

    caffe使用Ctrl-c 不能保存模型: 是因为使用的是 tee输出日志 解决方法:kill -s SIGINT <proc_id> 或者使用 GLOG_log_dir=/path/to ...

  4. 双击CAD对象(具有扩展数据),显示自定义对话框实现方法

    转自:Cad人生 链接:http://www.cnblogs.com/cadlife/p/3463337.html 题目:双击CAD对象,显示自定义对话框实现方法 内容粘贴如下: 主要是绑定两个事件: ...

  5. 17-TypeScript代理模式

    在有些情况下,我们需要把客户端真正调用的类和方法隐藏起来,而通过暴露代理类给客户端.客户端调用代理类的方式就可以访问到真实类提供的功能. abstract class Called{ protecte ...

  6. 我自己总结的C#开发命名规范整理了一份

    我自己总结的C#开发命名规范整理了一份 标签: 开发规范文档标准语言 2014-06-27 22:58 3165人阅读 评论(1) 收藏 举报  分类: C#(39)  版权声明:本文为博主原创文章, ...

  7. 新概念英语(1-37)Making a bookcase

    What is Susan's favourite color ? A:You're working hard, Georage. What are you doing? B:I am making ...

  8. 创建以mybatis为基础的web项目(2)mabitis中的一对一关系项目实战

    mabitis中的一对一关系项目实战: 1.首先根据创建以mybatis为基础的web项目(1)中的流程将web项目部署好 打开IDE,建立web工程 在lib下面粘贴mybatis的jar,log4 ...

  9. Qt QFile文件读写

    QFile 需要添加 #Include  <QFile> 集成至QIODevice 打开一个文件有3种方式QIODevice::(ReadOnly/WriteOnly/ReadWrite) ...

  10. Spark MLib:梯度下降算法实现

    声明:本文参考< 大数据:Spark mlib(三) GradientDescent梯度下降算法之Spark实现> 1. 什么是梯度下降? 梯度下降法(英语:Gradient descen ...