题目链接

题意:

  一副牌, 每个花色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. mysql_config_editor

    加入账号: [root@server-mysql bin]# ./mysql_config_editor set --login-path=client --user=root --password ...

  2. Linux 汇编语言开发指南

    http://www.ibm.com/developerworks/cn/linux/l-assembly/

  3. leecode 每日解题思路 64 Minimum Path Sum

    题目描述: 题目链接:64 Minimum Path Sum 问题是要求在一个全为正整数的 m X n 的矩阵中, 取一条从左上为起点, 走到右下为重点的路径, (前进方向只能向左或者向右),求一条所 ...

  4. js中对arry数组的各种操作小结

    最近工作比较轻松,于是就花时间从头到尾的对js进行了详细的学习和复习,在看书的过程中,发现自己平时在做项目的过程中有很多地方想得不过全面,写的不够合理,所以说啊,为了在以后的工作中写出最优化的代码,我 ...

  5. Android(java)学习笔记158:Java程序入口和Android的APK入口

    1.Java程序的入口:static main()方法 public class welcome extends Activity { @Override public void onCreate(B ...

  6. p

    都不知道简历去投什么地方.游戏都卖不出去,又做不出口碑好的.这些人是心存侥幸还是心存坚持. 感觉自己搞不清楚就很难再出发.

  7. 亿能测试白盒安全测试模板V1.0发布

    亿能测试白盒安全测试模板V1.0发布http://automationqa.com/forum.php?mod=viewthread&tid=2911&fromuid=21

  8. 如何搭建javaweb 开发环境

    一.准备工作: (1) 环境要求: 1.java jdk 2.eclipse--j2ee版 3.tomcat 4.mysql 5.HeidiSQL_7.0 (2)搭建步骤: 1.安装JDK,配置环境变 ...

  9. SQL Server 2012 数据库各个版本功能对比

    作为这篇SQL SERVER 2008数据库各版本功能对比 的姊妹篇,就写点SQL Server 2012 各个版本的区别以及物理以及逻辑上的限制. 个部分来分http://technet.micro ...

  10. Visual C++ 打印编程技术-编程基础-获取打印机

    标准方法是用: EnumPrinters() 函数获取 #define PRINTER_ENUM_DEFAULT 0x00000001 #define PRINTER_ENUM_LOCAL 0x000 ...