LightOj_1364 Expected Cards
题意:
一副牌, 每个花色13张牌,加上大小王,共54张。
遇到大小王可以代替其中某种花色。
给定C, D, H, S。
每次抽一张牌, 问抽到C张梅花, D张方块, H张红桃, S张黑桃所需要的最小次数的期望。
思路:
用dp[c][d][h][s][staues]表示当前有c张梅花,d张方块,h张红桃,s张黑桃,大小王的状态为staues时, 达到目标所需要的期望。
staues 用余三法进行状压, 因为大小王有两张, 变成某种花色的牌的数目就可能是0,1,2。
四种花色, 也就是2 * 1 + 2 * 3 + 2 * 9 + 2 * 27 = 80种状态。
再分情况考虑, 用dfs进行求解。
代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <set>
#include <map>
#include <list>
#include <queue>
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define MOD 1000000007
#define eps 1e-6
#define MAXN 16
#define MAXM 82
#define dd cout<<"debug"<<endl
#define p(x) printf("%d\n", x)
#define pd(x) printf("%.7lf\n", x)
#define k(x) printf("Case %d: ", ++x)
#define s(x) scanf("%d", &x)
#define sd(x) scanf("%lf", &x)
#define mes(x, d) memset(x, d, sizeof(x))
#define do(i, x) for(i = 0; i < x; i ++)
int C, D, H, S;
double dp[MAXN][MAXN][MAXN][MAXN][MAXM];
void init()
{
int i, j, k, m, l;
do(i, MAXN)
do(j, MAXN)
do(k, MAXN)
do(m, MAXN)
do(l, MAXM)
dp[i][j][k][m][l] = -1.0;
}
bool is_ok(int c, int d, int h, int s, int j)
{
int bit[] = {, , , };
int cnt = ;
while(j)
{
bit[cnt ++] = j % ;
j /= ;
}
c += bit[];
d += bit[];
h += bit[];
s += bit[];
if(c >= C && d >= D && h >= H && s >= S)
return true;
return false;
}
double dfs(int c, int d, int h, int s, int j)
{
double &res = dp[c][d][h][s][j];
if(res != -1.0)
return res;
if(is_ok(c, d, h, s, j))
return res = 0.0;
res = 0.0;
int bit[] = {, , , };
int num = ;
int jj = j;
for(int i = ; i < ; i ++)
{
bit[i] = j % ;
j /= ;
num += bit[i];
}
int sum = - (c + d + h + s + num);
if(c < && sum)
{
double p = ( - c) * 1.0 / sum;
res += (dfs(c + , d, h, s, jj) + ) * p;
}
if(d < && sum)
{
double p = ( - d) * 1.0 / sum;
res += (dfs(c, d + , h, s, jj) + ) * p;
}
if(h < && sum)
{
double p = ( - h) * 1.0 / sum;
res += (dfs(c, d, h + , s, jj) + ) * p;
}
if(s < && sum)
{
double p = ( - s) * 1.0 / sum;
res += (dfs(c, d, h, s + , jj) + ) * p;
}
if(num < && sum)
{
double p = ( - num) * 1.0 / sum;
int cnt = bit[] + + bit[] * + bit[] * + bit[] * ;
double temp = dfs(c, d, h, s, cnt); cnt = bit[] + (bit[] + ) * + bit[] * + bit[] * ;
temp = min(temp, dfs(c, d, h, s, cnt)); cnt = bit[] + bit[] * + (bit[] + ) * + bit[] * ;
temp = min(temp, dfs(c, d, h, s, cnt)); cnt = bit[] + bit[] * + bit[] * + (bit[] + ) * ;
temp = min(temp, dfs(c, d, h, s, cnt)); res += (temp + 1.0) * p;
}
return res;
} int main()
{
int T;
int kcase = ;
scanf("%d", &T);
while(T --)
{
scanf("%d %d %d %d", &C, &D, &H, &S);
int x = ;
init();
x = (C > ? C - : ) + (D > ? D - : ) + (H > ? H - : ) + (S > ? S - : );
if(x > )
printf("Case %d: -1\n", ++ kcase);
else
{
double ans = dfs(, , , , );
printf("Case %d: %.7lf\n", ++ kcase, ans);
}
}
return ;
}
LightOj_1364 Expected Cards的更多相关文章
- Light OJ 1364 Expected Cards (期望dp,好题)
题目自己看吧,不想赘述. 参考链接:http://www.cnblogs.com/jianglangcaijin/archive/2013/01/02/2842389.html #include &l ...
- KUANGBIN带你飞
KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题 //201 ...
- [kuangbin带你飞]专题1-23题目清单总结
[kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...
- ACM--[kuangbin带你飞]--专题1-23
专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 FliptilePOJ 1426 Find T ...
- Throwing cards away I
Throwing cards away I Given is an ordered deck of n cards numbered 1 to n with card 1 at the top a ...
- UVa 10935 - Throwing cards away I (队列问题)
原题 Throwing cards away I Given is an ordered deck of n cards numbered 1 to n with card 1 at the to ...
- uva 10935 throwing cards away <queue>
Given is an ordered deck of n cards numbered 1 to n with card 1 at the top and card n ...
- UVa---------10935(Throwing cards away I)
题目: Problem B: Throwing cards away I Given is an ordered deck of n cards numbered 1 to n with card 1 ...
- Throwing cards away I uva1594
Throwing cards away I Given is an ordered deck of n cards numbered 1 to n with card 1 at the t ...
随机推荐
- java21 封装Response:
封装Response: /** * 封装响应信息 */ public class Response { //两个常量 public static final String CRLF="\r\ ...
- 谈谈Javascript线程
其实,大家都知道Javascript的语言执行环境是单线程的,浏览器无论在什么时候都有且只有一个线程在运行Javascript程序.那Ajax发送异步请求怎么解释,setTimeout/s ...
- iOS开发篇-申请开发者账号流程
1.注册一个苹果的apple id申请apple id的地址: https://appleid.apple.com/account 2.如申请公司账号,请使用以下链接免费获取邓白氏号码,以下的申请表格 ...
- javascript中的内置对象
2015.12.1 javascript中的内置对象 复习: 1.js中的内置函数 alert prompt write parseInt parseFloat eval isNaN document ...
- 深入理解计算机系统第二版习题解答CSAPP 2.2
填写空白项. n 2n(十进制) 2n(十六进制) 9 512 0x200 19 0x80000 16384 0x4000 0x10000 17 0x20000 32 0x20 0x80
- php插件机制实现原理
插件,亦即Plug-in,是指一类特定的功能模块(通常由第三方开发者实现) 它的特点: 1. 随时安装.卸载.激活.禁用 2. 无论什么状态都不影响系统核心模块的运行, 3. 是一种非侵入式的模块化设 ...
- Linq to SQL只支持SQL Server(所选对象使用不支持的数据提供程序)
- T-SQL基础 (子查询,连接查询,交叉查询,事务|| 笔记0807)
一: A.子查询: 1.select 字段名 from table where 字段名=(select 字段名 from table 条件) //只能做1个匹配 2.select 字段名 from ...
- 堆排序算法(C#实现)
在软件设计相关领域,“堆(Heap)”的概念主要涉及到两个方面: 一种是数据结构,逻辑上是一颗完全二叉树,存储上是一个数组对象(二叉堆). 另一种是垃圾收集存储区,是软件系统可以编程的内存区域. 本文 ...
- DLL使用总结
最近项目中使用到了DLL,因此就把最近一段时间的学习总结一下,以备不时之需. 一.相关概念 1.动态链接库 自从微软推出第一个版本的Windows操作系统以来,动态链接库(DLL)一直是Windows ...