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

参考链接: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. Red Gate Software 软件推荐

    这家公司的Wiki http://en.wikipedia.org/wiki/Redgate http://www.red-gate.com/products/ 好吧 就介绍点免费的 Find SQL ...

  2. 【转】SQLite提示database disk image is malformed的解决方法

    SQLite有一个很严重的缺点就是不提供Repair命令. 导致死亡提示database disk image is malformed 它的产生有很多种可能,比如,磁盘空间不足,还有就是写入数据过程 ...

  3. zip压缩

    package com.green.project.compress; import java.io.File;import java.io.FileInputStream;import java.i ...

  4. poj 1789 Truck History

    题目连接 http://poj.org/problem?id=1789 Truck History Description Advanced Cargo Movement, Ltd. uses tru ...

  5. Linux获取线程tid线程名

    Linux获取线程tid线程名 1 2 3 4 5 6 //thread name char cThreadName[32] = {0}; prctl(PR_GET_NAME, (unsigned l ...

  6. 【EF Code First】 一对一、一对多的多重关系配置

    这里使用相册Album和图片Picture的关系做示例 1,Album与Picture最基本的关系是1-n(一个相册可以有多张图片) 这时Album.Picture实体类可以这么定义 /// < ...

  7. ExtJs桌面组件(DeskTop)

    在desktop\js目录中包含了5个js文件,这5个js文件如下: 还有css样式表:desktop.css,图片素材 在这5个js文件中封装了用于模拟桌面的类,这些类如下: Ext.ux.Star ...

  8. python djange输入中文错误的解决办法

    UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) ...

  9. penmount串口触摸屏加载

    static irqreturn_t pm_interrupt(struct serio *serio,  unsigned char data, unsigned int flags){ struc ...

  10. Java-包

    定义包用package关键字. 1:对类文件进行分类管理. 2:给类文件提供多层名称空间. 如果生成的包不在当前目录下,需要最好执行classpath,将包所在父目录定义到classpath变量中即可 ...