UVa 1637 - Double Patience(概率DP)
链接:
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)的更多相关文章
- UVA 1637 Double Patience
题意:36张扑克,平分成9摞,两张数字一样的可以拿走,每次随机拿两张,问能拿光的概率. 解法:记忆化搜索,状态压缩.一开始我想在还没拿的时候概率是1,然后往全拿光推···样例过不去···后来觉得推反了 ...
- Substring UVA - 11468 AC自动机+概率DP
题意: 给出一些字符和各自对应的选择概率,随机选择L次后得到一个长度为L的随机字符串S. 给出K个模板串,计算S不包含任何一个模板串的概率 dp[i][j]表示走到AC自动机 i 这个节点 还需要走 ...
- UVA 10529-Dumb Bones(概率dp)
题意: 给出放一个多米诺骨牌,向左向右倒的概率,求要放好n个骨牌,需要放置的骨牌的期望次数. 分析: 用到区间dp的思想,如果一个位置的左面右面骨牌都已放好,考虑,放中间的情况, dp[i]表示放好前 ...
- 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 ...
- UVA 11021 C - Tribles(概率DP)
记忆化就可以搞定,比赛里都没做出来,真的是态度有问题啊... #include <iostream> #include<cstdio> #include<cstring& ...
- UVa 11468 (AC自动机 概率DP) Substring
将K个模板串构成一个AC自动机,那些能匹配到的单词节点都称之为禁止节点. 然后问题就变成了在Tire树上走L步且不经过禁止节点的概率. 根据全概率公式用记忆化搜索求解. #include <cs ...
- uva 11468 AC自动机+概率DP
#include<cstdio> #include<cstring> #include<queue> #include<cstdio> #include ...
- 数学期望和概率DP题目泛做(为了对应AD的课件)
题1: Uva 1636 Headshot 题目大意: 给出一个000111序列,注意实际上是环状的.问是0出现的概率大,还是当前是0,下一个还是0的概率大. 问题比较简单,注意比较大小: A/C & ...
- POJ2794 Double Patience[离散概率 状压DP]
Double Patience Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 694 Accepted: 368 Cas ...
随机推荐
- step5: 编写spider爬取
改写parse函数 实现功能: 1.获取文章列表页中的文章url并交给scrapy下载后,交给解析函数进行具体字段的解析2.获取下一页的url并交给scrapy进行下载,下载完成后交给parse 提取 ...
- [转]angularjs之ui-grid 使用详解
本文转自:http://blog.csdn.net/qhkabuqiluo/article/details/52237710 最近一段时间在使用angularjs 然后就找到ui-grid 这个比较不 ...
- android socket 通讯(客户端) 发送数据
/** ClientSocket通讯类 **/ public class ClientSocket { /**服务器地址*/ private String serverUrl=&q ...
- Asp.Net MVC4通过id更新表单
用户需求是:一个表单一旦创建完,其中大部分的字段便不可再编辑.只能编辑其中部分字段. 而不可编辑是通过对input输入框设置disabled属性实现的,那么这时候直接向数据库中submit表单中的内容 ...
- Docker问题集合
1. 安装后启动出现 解决办法: 删除以下文件夹重新启动docker服务即可: 可能原因:(1) 之前docker进程出现错误并保存在keys.json文件中 (2) 删除之前配置了阿里云镜像,生成了 ...
- thinkphp session设置
<?php namespace Home\Controller; use think\Controller; /*登录*/ class LoginController extends Publi ...
- (1-3)line-height与图片的表现
(1-3)line-height与图片的表现 这篇文章真的很重要,耐心看,重中之重. 一.行高和图片的表现 图片和行高有什么歪腻呢?? 很多人不明白,为什么我图片好好的放在一个标签里面它就出现了如下问 ...
- JavaScript的进阶之路(二)函数简介,变量、作用域和内存问题
<h3>ECMAScript中函数不存在函数签名的概念,没有重载</h3><h3>无需指定返回值,可以在任何时候返回任何值.未指定返回值的函数,返回的是一个特殊的u ...
- How to use Log4cplus
Introduction Log4cplus is derived by the popular Log4j written in java.<br>This tutorial show ...
- 【阿里云产品公测】OpenSearch初体验
OpenSearch是一个非常有意义的功能,对于很多数据量较大的站点, SF2< 如果搜索功能自己做的话,或者用数据库里的查询语句,首先效率低下,而且占用资源. ); <Le6 另 ...