Light OJ 1364 Expected Cards (期望dp,好题)
题目自己看吧,不想赘述。
参考链接: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,好题)的更多相关文章
- 期望dp好题选做
前言: 最近连考两场期望dp的题目,sir说十分板子的题目我竟然一点也不会,而且讲过以后也觉得很不可改.于是开个坑. 1.晚测10 T2 大佬(kat) 明明有\(O(mlog)\)的写法,但是\(m ...
- Light OJ 1030 - Discovering Gold(概率dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1030 题目大意:有一个很长的洞穴, 可以看做是1-n的格子.你的起始位置在1的 ...
- Light OJ 1031 - Easy Game(区间dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1031 题目大意:两个选手,轮流可以从数组的任意一端取值, 每次可以去任意个但仅 ...
- light oj 1422 Halloween Costumes (区间dp)
题目链接:http://vjudge.net/contest/141291#problem/D 题意:有n个地方,每个地方要穿一种衣服,衣服可以嵌套穿,一旦脱下的衣服不能再穿,除非穿同样的一件新的,问 ...
- light oj 1205 - Palindromic Numbers 数位DP
思路:搜索的时候是从高位到低位,所以一旦遇到非0数字,也就确定了数的长度,这样就知道回文串的中心点. 代码如下: #include<iostream> #include<cstdio ...
- Light OJ 1050 - Marbles(概率DP)
题目大意: 一个包裹里有蓝色和红色的弹珠,在这个包裹里有奇数个弹珠,你先走, 你先从背包里随机的拿走一个弹珠,拿走每个弹珠的可能性是一样的.然后Jim从背包里拿走一个蓝色的弹珠,如果没有蓝色的弹珠让J ...
- Light OJ 1033 - Generating Palindromes(区间DP)
题目大意: 给你一个字符串,问最少增加几个字符使得这个字符串变为回文串. ============================================================= ...
- Light OJ 1422 - Halloween Costumes(区间DP 最少穿几件)
http://www.cnblogs.com/kuangbin/archive/2013/04/29/3051392.html http://www.cnblogs.com/ziyi--caolu/a ...
- Light oj 1125 - Divisible Group Sums (dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1125 题意: 给你n个数,q次询问,每次询问问你取其中m个数是d的整数倍的方案 ...
随机推荐
- DB2递归查询
斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&g ...
- linux中fork()函数详解
一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同, ...
- android获取手机录
在Android开发中,读取手机通讯录中的号码是一种基本操作,但是由于Android的版本众多,所以手机通讯录操作的代码比较纷杂,在本文中进行一下总结. Android1.5是现在的Android系统 ...
- WdatePicker 动态变量表
4. 日期范围限制静态限制 注意:日期格式必须与 realDateFmt 和 realTimeFmt 一致 你可以给通过配置minDate(最小日期),maxDate(最大日期)为静态日期值,来限定日 ...
- iOS学习之C语言指针
访问数据的两种方式: 1.直接访问: 2.间接访问:先找到内存地址,根据地址访问存储单元.(内存地址 被称为指针) 定义指针变量: 类型修饰符 *指针变量名 = NULL; NULL表示空指针,相当 ...
- iOS学习之C语言数据类型
1.进制 0 1 2 3 4 5 6 7 8 9 A B C D E F 0X123(十六进制) 0123(八进制) 位权:单位数字的基本数值 2.数据类型 关键字 说明 字节大小 char ...
- 使用JSON的数据格式
在说JSON之前,我们先来看一下在javascript中创建对象的方式,也就是创建对象的字面量表示法.我们知道js中有五种基本的数据类型,分别是: Undefined(变量可能没有声明或者赋值) ...
- android不要标题栏
去除标题栏title其实非常简单,他有两种方法,一种是在代码中添加,另一种是在AndroidManifest.xml中添加: 1.在代码中实现: 在此方法setContentView(R.layout ...
- 关于spring mvc MaxUploadSizeExceededException 死循环解决方案
当看到这文章的时候相信你现在应该遇到这样的问题了,我也是自己遇到了后来找到解决方案了记录下来,如果下次遇到就可以直接解决了. 至于为什么会出现这样的情况,可以看这篇文章:https://bz.apac ...
- java笔试题(3)
short a = 1; a = a + 1; 有错吗? short a = 1; a += 1; 有错吗? 对于short a = 1; a = a + 1;由于a + 1 运算时会自动提升表达式的 ...