52张扑克牌,问拿到指定数量的4个花色的最少次数期望是多少,其中拿到joker必须马上将其视作一种花色,且要使后续期望最小。

转移很容易想到,主要是两张joker的处理,一个状态除了普通的4个方向的转移,当没拿到joker时还要增加拿到joker的期望,根据题意直接在当前状态下找最小的期望计算即可。

/** @Date    : 2017-08-29 17:58:59
* @FileName: LightOJ 1364 概率DP.cpp
* @Platform: Windows
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version : $Id$
*/
#include <bits/stdc++.h>
#define LL long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1 ,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 1e5+20;
const double eps = 1e-8; double dp[15][15][15][15][5][5];
int A, B, C, D; double dfs(int a, int b, int c, int d, int x, int y)
{
if(dp[a][b][c][d][x][y] > -1)
return dp[a][b][c][d][x][y];
double tot = a + b + c + d + (x==0?1:0) + (y==0?1:0);
int pa = 13 - a, pb = 13 - b, pc = 13 - c, pd = 13 - d;
if(x == y && x == 1) pa += 2;//
else if(x == 1 || y == 1) pa++; if(x == y && x == 2) pb += 2;//
else if(x == 2 || y == 2) pb++; if(x == y && x == 3) pc += 2;//
else if(x == 3 || y == 3)pc++; if(x == y && x == 4) pd += 2;//
else if(x == 4 || y == 4) pd++; if(pa >= A && pb >= B && pc >= C && pd >= D)
return dp[a][b][c][d][x][y] = 0;
//
double ans = 0.0;
if(a)
ans += (double)a / tot * dfs(a - 1, b, c, d, x, y) * 1.000000000;
if(b)
ans += (double)b / tot * dfs(a, b - 1, c, d, x, y) * 1.000000000;
if(c)
ans += (double)c / tot * dfs(a, b, c - 1, d, x, y) * 1.000000000;
if(d)
ans += (double)d / tot * dfs(a, b, c, d - 1, x, y) * 1.000000000;
if(x == 0)
{
double e = 0x7f;
for(int i = 1; i <= 4; i++)
e = min(e, dfs(a, b, c, d, i, y));
ans += (1.00000 / tot) * e;
}
if(y == 0)
{
double e = 0x7f;
for(int i = 1; i <= 4; i++)
e = min(e, dfs(a, b, c, d, x, i));
ans += (1.00000 / tot) * e;
}
//cout << "~" << endl;
return dp[a][b][c][d][x][y] = ans + 1;
}
int main()
{
int T;
cin >> T;
int icase = 0;
while(T--)
{
scanf("%d%d%d%d", &A, &B, &C, &D);
memset(dp, 0xc2, sizeof(dp));
//cout << ******dp << endl;
int cnt = (A-13>0?A-13:0) + (C-13>0?C-13:0) + (B-13>0?B-13:0) + (D-13>0?D-13:0);
if(cnt > 2)
printf("Case %d: -1\n", ++icase);
else
printf("Case %d: %.10lf\n", ++icase, dfs(13,13,13,13,0,0)); }
return 0;
}

LightOJ 1364 树形DP的更多相关文章

  1. lightoj 1382 - The Queue(树形dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1382 题解:简单的树形dp加上组合数学. #include <iostr ...

  2. lightoj 1201 - A Perfect Murder(树形dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1201 题解:简单的树形dp,dp[0][i]表示以i为根结点不傻i的最多有多少 ...

  3. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  4. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  5. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  6. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  7. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  8. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  9. POJ2342 树形dp

    原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...

随机推荐

  1. 《JavaScript》JavaScript的名字和版本

    语言标准版本名字:ECMAScript(ECMA是欧洲计算机制造协会,据说可能是专门做标准的,除了JavaScript遵循这个标准以外,还有XX....)    Jscript(IE对该语言实现版本的 ...

  2. prefix pch 中引用cocoapods 中的头文件失败

    如题,遇到这个问题,卡了几个小时,记下来防止下次再卡住: 解决办法: 1.pod install, 2.新建pch文件:projectname-Prefix.pch, 3.按要求在工程配置中添加, O ...

  3. Iterable,Iterator和forEach

    Iterable Interface Iterable<T> 方法: Iterator<T> iterator() Returns an iterator over a set ...

  4. 软工网络15团队作业4-DAY5

    每日例会 昨天的工作. 张陈东芳:界面排版优化 吴敏烽:界面排版优化 周汉麟:继续根据商品编号来获取商品资料方法调试 林振斌:继续输出最近浏览记录的方法调试 李智:界面排版优化 全体人员:界面优化,初 ...

  5. Hadoop环境搭建(三)

    长久没用了,再次登陆Ubuntu的时候提醒密码错误,然后就进入了guest session,依然可以进入系统进行工作但身份是guest,于是开始了找回密码的漫漫长路. 首先,在guest模式下,右上角 ...

  6. 找xpath好用的工具(比较少用,针对只能在IE上打开的网站)

    有一些网站只能在IE浏览器里打开,不像firefox那样有好多好用的插件来找元素的xpath,css path等. 当然现在IE也可以,F12出现像firebug那样的窗口,来查看元素. 这里呢在介绍 ...

  7. Jmeter 中JDBC request 详解 !

    JDBC Request: 这个sampler可以向数据库发送一个jdbc请求(sql语句),它经常需要和JDBC Connection Configuration 配置元件一起配合使用. 目录: 一 ...

  8. PHP中面向对象编程思想的3个特征

    面向对象编程思想的3个特征: 封装: 无非是一个大的指向思想,目的是为了将一个类设计得更为健壮! 其基本做法是: 尽可能地将一个类的成员私有化,只开放那些必不可少的对外的属性或方法,能private的 ...

  9. vscode如何用浏览器预览运行html文件

    1,打开vscode编辑器,点击编辑器主界面左上侧第五个小图标——‘扩展’按钮: 2,进入扩展搜索右拉框,在应用商店搜索框中输入“view in browser”会自动进行搜索 3,等待几秒钟时间,扩 ...

  10. 题解 P1781 【宇宙总统】

    小金羊发现用的方法和python大佬们的方法还是不一样... (大概是我太弱了qAq) emmm... (Mode:Python 3)Code: a=int(input()) #几个数 L=list( ...