题目链接

题意:

  一副牌, 每个花色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的更多相关文章

  1. Light OJ 1364 Expected Cards (期望dp,好题)

    题目自己看吧,不想赘述. 参考链接:http://www.cnblogs.com/jianglangcaijin/archive/2013/01/02/2842389.html #include &l ...

  2. KUANGBIN带你飞

    KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题    //201 ...

  3. [kuangbin带你飞]专题1-23题目清单总结

    [kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...

  4. ACM--[kuangbin带你飞]--专题1-23

    专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 FliptilePOJ 1426 Find T ...

  5. 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 ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. UIStackView 看我就够了

    介绍 UIStackView 是 iOS9新增的一个布局技术.熟练掌握相当节省布局时间. UIStackView 是 UIView 的子类,是用来约束子控件的一个控件.但他的作用仅限于此,他不能用来呈 ...

  2. Android(java)学习笔记210:采用post请求提交数据到服务器(qq登录案例)

    1.POST请求:  数据是以流的方式写给服务器 优点:(1)比较安全 (2)长度不限制 缺点:编写代码比较麻烦   2.我们首先在电脑模拟下POST请求访问服务器的场景: 我们修改之前编写的logi ...

  3. 安装tensorflow

    官网:http://tensorflow.org/安装步骤:1.sudo apt-get install python-pip python-dev python-virtualenv 3    co ...

  4. 《转》手把手教你使用Git

    Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不 需要联网了,因为版本都是在自己的电脑上.既然每个人的电脑都有一个完整的版本库,那多个人如何 ...

  5. nofollow标签如何使用

    “nofollow”的意思是不传递权重,向网站站长提供了一种方式,即告诉搜索引擎“不要追踪此网页上的链接”或“不要追踪此特定链接”. nofllow的形式 1.<meta name=" ...

  6. webrtc学习——mediaStream和MediaStreamTrack

    This is an experimental technologyBecause this technology's specification has not stabilized, check ...

  7. 20160420javaweb之文件上传和下载

    一.文件上传 1.提供表单允许用户通过表单选择文件进行上传 表单必须是POST提交 文件输入框必须有name属性,只有有name属性的输入项浏览器才会进行提交 需要设置enctype属性值为multi ...

  8. MVC小系列(二十二)【MVC的Session超时,导致的跳转问题】

    由于mvc内部跳转机制的问题,它只在当前的action所渲染的view上进行跳转,如果希望在当前页面跳,需要将mvc方法改为js方法: filterContext.Result = new Redir ...

  9. 1_使用Java文件的并发写

    为了实现,并发写操作,首先实验一下在本地情况下, 将一个文件切分成若干个 文件块 然后将文件块 通过多线程的并发的方式写入到指定目录下的文件中. 下面是简单的试着实现代码,暂时 先进行记录一下: im ...

  10. 通过javascript库JQuery实现页面跳转功能代码

    通过javascript库JQuery实现页面跳转功能代码的四段代码实例如下. 实例1: 1 2 3 4 $(function(){ var pn = $("#gotopagenum&quo ...