题目自己看吧,不想赘述。

参考链接:http://www.cnblogs.com/jianglangcaijin/archive/2013/01/02/2842389.html

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
/*
dp[c][d][h][s][x1][x2]: 表示有c张为梅花,d张为方块,h张为红桃,s张为草花,第一张王作为x1,第二张作为x2 的情况下,
距离目标状态的期望数。 */
using namespace std;
const int INF=0x3f3f3f3f;
double dp[][][][][][];
int vis[][][][][][];
int C,D,H,S; double dfs(int c,int d,int h,int s,int x1,int x2){
if(vis[c][d][h][s][x1][x2])
return dp[c][d][h][s][x1][x2];
vis[c][d][h][s][x1][x2]=;
int left=-c-d-h-s; //剩余的牌数
if(!x1)
left++;
if(!x2)
left++;
int cnt[]; //现有花色的牌数
cnt[]=c;cnt[]=d;cnt[]=h;cnt[]=s;
if(x1) cnt[x1]++;
if(x2) cnt[x2]++;
if(cnt[]>=C&&cnt[]>=D&&cnt[]>=H&&cnt[]>=S)
return ;
double ans=;
int num[]; //储存各花色剩余的牌数
num[]=-c;
num[]=-d;
num[]=-h;
num[]=-s; //当前抽中c的概率为num[1]/left,下面类同
if(num[])
ans+=1.0*num[]/left*dfs(c+,d,h,s,x1,x2);
if(num[])
ans+=1.0*num[]/left*dfs(c,d+,h,s,x1,x2);
if(num[])
ans+=1.0*num[]/left*dfs(c,d,h+,s,x1,x2);
if(num[])
ans+=1.0*num[]/left*dfs(c,d,h,s+,x1,x2);
double tmp=INF;
if(!x1){
for(int i=;i<=;i++){
tmp=min(tmp,dfs(c,d,h,s,i,x2));
}
ans+=1.0/left*tmp;
}
tmp=INF;
if(!x2){
for(int i=;i<=;i++){
tmp=min(tmp,dfs(c,d,h,s,x1,i));
}
ans+=1.0/left*tmp;
}
ans++; //加1,即必须抽1张牌
dp[c][d][h][s][x1][x2]=ans;
return ans;
}
int main()
{
int t,cases=;
scanf("%d",&t);
while(t--){
scanf("%d%d%d%d",&C,&D,&H,&S);
int x=;
if(C>)
x+=C-;
if(D>)
x+=D-;
if(H>)
x+=H-;
if(S>)
x+=S-;
if(x>){
printf("Case %d: -1\n",++cases);
continue;
}
memset(vis,,sizeof(vis));
memset(dp,,sizeof(dp));
printf("Case %d: %.7lf\n",++cases,dfs(,,,,,));
}
return ;
}

Light OJ 1364 Expected Cards (期望dp,好题)的更多相关文章

  1. 期望dp好题选做

    前言: 最近连考两场期望dp的题目,sir说十分板子的题目我竟然一点也不会,而且讲过以后也觉得很不可改.于是开个坑. 1.晚测10 T2 大佬(kat) 明明有\(O(mlog)\)的写法,但是\(m ...

  2. Light OJ 1030 - Discovering Gold(概率dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1030 题目大意:有一个很长的洞穴, 可以看做是1-n的格子.你的起始位置在1的 ...

  3. Light OJ 1031 - Easy Game(区间dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1031 题目大意:两个选手,轮流可以从数组的任意一端取值, 每次可以去任意个但仅 ...

  4. light oj 1422 Halloween Costumes (区间dp)

    题目链接:http://vjudge.net/contest/141291#problem/D 题意:有n个地方,每个地方要穿一种衣服,衣服可以嵌套穿,一旦脱下的衣服不能再穿,除非穿同样的一件新的,问 ...

  5. light oj 1205 - Palindromic Numbers 数位DP

    思路:搜索的时候是从高位到低位,所以一旦遇到非0数字,也就确定了数的长度,这样就知道回文串的中心点. 代码如下: #include<iostream> #include<cstdio ...

  6. Light OJ 1050 - Marbles(概率DP)

    题目大意: 一个包裹里有蓝色和红色的弹珠,在这个包裹里有奇数个弹珠,你先走, 你先从背包里随机的拿走一个弹珠,拿走每个弹珠的可能性是一样的.然后Jim从背包里拿走一个蓝色的弹珠,如果没有蓝色的弹珠让J ...

  7. Light OJ 1033 - Generating Palindromes(区间DP)

    题目大意: 给你一个字符串,问最少增加几个字符使得这个字符串变为回文串.   ============================================================= ...

  8. Light OJ 1422 - Halloween Costumes(区间DP 最少穿几件)

    http://www.cnblogs.com/kuangbin/archive/2013/04/29/3051392.html http://www.cnblogs.com/ziyi--caolu/a ...

  9. Light oj 1125 - Divisible Group Sums (dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1125 题意: 给你n个数,q次询问,每次询问问你取其中m个数是d的整数倍的方案 ...

随机推荐

  1. LaTeX插入jpg图片: 使用graphicx

    首先要包含宏包 \usepackage{graphicx} \begin{figure}[ht!] \centering \includegraphics[width=90mm]{fixed_dome ...

  2. Php+Redis 实现Redis提供的lua脚本功能

    <?php require_once "predis-0.8/autoload.php"; $config['schema'] = 'tcp'; $config['host' ...

  3. Why string is immutable in Java ?

    This is an old yet still popular question. There are multiple reasons that String is designed to be ...

  4. hdu 2680 Choose the best route

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2680 Choose the best route Description One day , Kiki ...

  5. hdu 4217 Data Structure?/treap

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4217 可用线段树写,效率要高点. 这道题以前用c语言写的treap水过了.. 现在接触了c++重写一遍 ...

  6. C#.Net 图片处理大全

    C# How to: Image filtering by directly manipulating Pixel ARGB values C# How to: Image filtering imp ...

  7. MySQL使用rand函数实现随机数[转]

    如何写一个语句能一下更新几百条MYSQL数据! 需要测试MYSQL数据库,里面有一个上万条数据的数据库,如何写一个PHP文件一下每次更新几百条信息,我都是写一个循环一次更新一条信息,这样我知道用WHI ...

  8. 转载:监控每个节点(jvm部分)

    操作系统和进程部分 操作系统和进程部分的含义是很清楚的,这里不会描述的很详细.他们列出了基本的资源统计,例如CPU和负载.操作系统部分描述了整个操作系统的情况,进程部分只是描述了Elasticsear ...

  9. Swift的一些基础内容

    //①判断字符串是否为空的方法 isEmpty var str:String = "www.baidu.com" if str.isEmpty { print("空字符串 ...

  10. JS跨域方法及原理

        JS跨域分析判断 JS跨域:在不同域之间,JS进行数据传输或通信.比如ajax向不同的域请求数据.JS获取iframe中的页面中的值(iframe内外不同域) 只要协议.端口.域名有一个不同则 ...