题目链接

题意:

  一副牌, 每个花色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. cocos2d-x设计模式发掘之五:防御式编程模式

    http://www.ityran.com/archives/2105 本文由子龙山人原创,泰然授权转载,转载请注明出处并通知子龙山人! 声明:防御式编程是提高程序代码质量的一种手段,它不能算是真正意 ...

  2. 使用AOP 实现Redis缓存注解,支持SPEL

    公司项目对Redis使用比较多,因为之前没有做AOP,所以缓存逻辑和业务逻辑交织在一起,维护比较艰难所以最近实现了针对于Redis的@Cacheable,把缓存的对象依照类别分别存放到redis的Ha ...

  3. Android(java)学习笔记138:html嵌入到java显示乱码

    解决方案: 使用 loadData方法是中文部分会出现乱码,即使指定“utf-8”.“gbk”.“gb2312”也一样. webView.getSettings().setDefaultTextEnc ...

  4. javascript中的内置对象

    2015.12.1 javascript中的内置对象 复习: 1.js中的内置函数 alert prompt write parseInt parseFloat eval isNaN document ...

  5. java Map的遍历

    List下的Map的遍历方法 List<String> Keys =new ArrayList<String>(); ){ ;row<SheetData.size() ; ...

  6. initMethod 和 afterPropertiesSet 以及 AwareMethod方法的执行时机

    在spring开发中,我们定义bean 经常会需要用到beanFactory对象,这就需要实现BeanFactoryAware这种类型的接口,它有一个setBeanFactory方法   在xml中配 ...

  7. Android XML解析

    解析XML有三种方式:Dom.SAX.Pull 其中pull解析器运行方式与SAX类似. 我们首先认识pull解析器:http://developer.android.com/intl/zh-cn/r ...

  8. Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出

    Js新手最近在研究Js数据结构,刚好看到链表实现这一块儿,觉得有些资料和自己理解的有冲突,于是借着自己以前一点点C语言的基础,用Javascript模仿了C的链表实现,并且用了process.stdi ...

  9. 10.14_魅族手机音乐播放无故暂停,MetroUICss-tile中的字如何居中

    (1)魅族手机,播放音乐,无故暂停.不管是自带的音乐播放程序,还是下载的其他音乐播放器都是如此.而且,手机上有个Google服务耗电量非常高,会经常弹出登陆Google账号的弹出项. (2)Metro ...

  10. c++学习笔记2(c++简单程序)

    c++的简单程序 练习一: #include <iostream>int main(){std::cout<<"你好c++\n";int x;std::ci ...