链接:

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

题意:

36张牌分成9堆,每堆4张牌。每次可以拿走某两堆顶部的牌,但需要点数相同。如果有多种拿法则等概率的随机拿。
例如,9堆顶部的牌分别为KS, KH, KD, 9H, 8S, 8D, 7C, 7D, 6H,
则有5种拿法(KS,KH), (KS,KD), (KH,KD), (8S,8D), (7C,7D),每种拿法的概率均为1/5。
如果最后拿完所有牌则游戏成功。按顺序给出每堆牌的4张牌,求成功概率。

分析:

用9元组表示当前状态,即每堆牌剩的张数,状态总数为5^9=1953125。
设d[i]表示状态i对应的成功概率,则根据全概率公式,d[i]为后继状态的成功概率的平均值。

代码:

 import java.io.*;
import java.util.*; public class Main {
static char card[][][] = new char[9][4][2+5];
static HashMap<ArrayList<Integer>,Double> d
= new HashMap<ArrayList<Integer>,Double>(); static double dp(ArrayList<Integer> A, int c) { // c为剩余总牌数
if(c == 0) return 1;
if(d.containsKey(A)) return d.get(A);
int tot = 0;
double sum = 0;
for(int t = 0; t < 9; t++) if(A.get(t) > 0) {
for(int i = t+1; i < 9; i++) if(A.get(i) > 0) {
if(card[t][A.get(t)-1][0] != card[i][A.get(i)-1][0]) continue;
tot++;
A.set(t, A.get(t)-1); A.set(i, A.get(i)-1);
sum += dp(A, c-2);
A.set(t, A.get(t)+1); A.set(i, A.get(i)+1);
}
}
d.put(A, tot == 0 ? 0.0 : sum / tot);
return d.get(A);
} public static void main(String args[]) {
Scanner cin = new Scanner(new BufferedInputStream(System.in)); while(cin.hasNext()) {
for(int r = 0; r < 9; r++)
for(int c = 0; c < 4; c++)
card[r][c] = cin.next().toCharArray();
d.clear();
ArrayList<Integer> A = new ArrayList<Integer>();
for(int i = 0; i < 9; i++) A.add(4);
System.out.printf("%.6f\n", dp(A, 36));
}
cin.close();
}
}

UVa 1637 - Double Patience(概率DP)的更多相关文章

  1. UVA 1637 Double Patience

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

  2. Substring UVA - 11468 AC自动机+概率DP

    题意: 给出一些字符和各自对应的选择概率,随机选择L次后得到一个长度为L的随机字符串S. 给出K个模板串,计算S不包含任何一个模板串的概率 dp[i][j]表示走到AC自动机 i 这个节点 还需要走 ...

  3. UVA 10529-Dumb Bones(概率dp)

    题意: 给出放一个多米诺骨牌,向左向右倒的概率,求要放好n个骨牌,需要放置的骨牌的期望次数. 分析: 用到区间dp的思想,如果一个位置的左面右面骨牌都已放好,考虑,放中间的情况, dp[i]表示放好前 ...

  4. UVA 10529 - Dumb Bones (概率dp)

    题目描述 You are trying to set up a straight line of dominos, standing on end, to be pushed over later f ...

  5. UVA 11021 C - Tribles(概率DP)

    记忆化就可以搞定,比赛里都没做出来,真的是态度有问题啊... #include <iostream> #include<cstdio> #include<cstring& ...

  6. UVa 11468 (AC自动机 概率DP) Substring

    将K个模板串构成一个AC自动机,那些能匹配到的单词节点都称之为禁止节点. 然后问题就变成了在Tire树上走L步且不经过禁止节点的概率. 根据全概率公式用记忆化搜索求解. #include <cs ...

  7. uva 11468 AC自动机+概率DP

    #include<cstdio> #include<cstring> #include<queue> #include<cstdio> #include ...

  8. 数学期望和概率DP题目泛做(为了对应AD的课件)

    题1: Uva 1636 Headshot 题目大意: 给出一个000111序列,注意实际上是环状的.问是0出现的概率大,还是当前是0,下一个还是0的概率大. 问题比较简单,注意比较大小: A/C & ...

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

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

随机推荐

  1. pyquery库简介

    html = '''<div><ul><li class="item-0">li0</li><li class="i ...

  2. Javascript与jQuery方法的隐藏与显示

    如题,代码奉上. <html> <head> <title>denotoggle</title> <style> #box { width: ...

  3. Gradle 学习(一)

    引入插件 apply plugin: 'java' apply plugin: 'war' apply plugin: 'jetty' 如果希望使用jar来启动项目, 可以这样修改项目和插件属性. a ...

  4. HttpClient 入门教程学习

    HttpClient简介 HttpClient是基于HttpCore的HTTP/1.1兼容的HTTP代理实现. 它还为客户端认证,HTTP状态管理和HTTP连接管理提供可重用组件. HttpCompo ...

  5. 纯手写实现HashMap

    1.hashmap的实现 ① 初始化 1)定义一个Node<K, V>的数组来存放元素,但不立即初始化,在使用的时候再加载 2)定义数组初始大小为16 3)定义负载因子,默认为0.75, ...

  6. Java finally关键字

    关于finally语句块,有如下特点: 1.finally语句块可以直接和try语句块联用.try...finally... 2.try...catch...finally也可以 3.通常在final ...

  7. jQuery多次选中checkbox失效

    在做项目的过程中,遇到一个问题.就是使用jquery的attr方法即 $("#aaa").attr('checked',true); $("#aaa").att ...

  8. HDU4652:Dice

    题面 传送门 题意 \(m\)面的骰子 求连续出现\(n\)个相同面的期望次数 或者 求连续出现\(n\)个不同面的期望次数 Sol 设\(f[i]\)表示已经出现了\(i\)~\(n\)这些面相同的 ...

  9. 鼠标移动事件(跟随鼠标移动的div)

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  10. Ubuntu / Raspberry 下切换GCC版本

    目前Ubuntu 自带的GCC版本为4.6,遗憾的是在实际使用时,反而版本越高越好问题越多,所以,一旦遇到编译问题时最好先检查你下载的工程里的readme,默认的编译器版本是否为当前的安装版本,如果不 ...