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的整数倍的方案 ...
随机推荐
- ED/EP系列7《指令速查表》
命 令 CLA INS ...
- scp 跨机远程拷贝
scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器. 命令格式: scp [参数] [原路径] [目标路径] ...
- Oracle Rac crs无法启动
OS:ORACLE LINUX 5.7 DB:11.2.0.3 RAC:YES 故障:1.两节点RAC,节点分别为linuxdb1.linuxdb2,其中节点linuxdb2服务器出现故障,无法启动2 ...
- uninstall 11.2.0.3.0 grid & database in linux 5.7
OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ...
- hdu 5412 CRB and Queries
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5412 CRB and Queries Description There are $N$ boys i ...
- layer 弹出子页面然后给父页面赋值
//----赋值 并关闭当前页面 开始---- FunctionActionDeleteXZ = function (CompanyId, RelCompanyName) { parent.$(&qu ...
- 41.使用Chipscope时如何防止reg_wire型信号被优化掉
随着FPGA设计复杂程度越来越高,芯片内部逻辑分析功能显得越来越重要.硬件层次上的逻辑分析仪价格十分昂贵,而且操作比较复杂.目前,FPGA芯片的两大供应商都为自己的FPGA芯片提供了软件层面上的逻辑分 ...
- Hibernate从入门到精通(十)多对多单向关联映射
上一篇文章Hibernate从入门到精通(九)一对多双向关联映射中我们讲解了一下关于一对多关联映射的相关内容,这次我们继续多对多单向关联映射. 多对多单向关联映射 在讲解多对多单向关联映射之前,首先看 ...
- Mono for Android (2)-- Android应用程序初认识
一:日志记录 先添加using Android.Util; 在该命名控件下有log类 Log.Info("HA", "End onCreate"); //记录消 ...
- 如何在Swing窗体增删组件后及时刷新显示新界面
转自:http://blog.csdn.net/leeshuqing/article/details/8636211 关键的四行代码,连续调用窗体的四个方法即可: repaint();validate ...