[CH3803] 扑克牌 (期望DP+记忆化搜索)
[题目链接] [CH3803] 扑克牌
[题面描述] \(54\)张牌,每次随机摸一张,求得到 A张黑桃 B张红桃 C张梅花 D张方块 的期望步数.特别地,大王和小王可以当做任意一种花色,当然,会选择当前的最优策略.
设\(f[a][b][c][d][p][q]\)代表已选了\(a,b,c,d,\)王的情况为\(p,q\)时到达目标的期望步数.设最终状态步数为\(0\),则\(f[0][0][0][0]\)即为所求.
这是因为初始情况只有一个,而最终情况有很多种.
所以这道题用到 记忆化搜索
算出已经选的牌\(sum\),则有
\(f[a][b][c][d][p][q]=\frac{13-a}{54-sum}f[a+1][b][c][d][p][q]+\frac{13-b}{54-sum}f[a][b+1][c][d][p][q]\)
\(+\frac{13-c}{54-sum}f[a][b][c+1][d][p][q]+\frac{13-d}{54-sum}f[a][b][c][d+1][p][q]\)
\(+min\{\frac{1}{54-sum}f[a][b][c][d][1∼4][q]\}(if \ p==0)\)
\(+min\{\frac{1}{54-sum}f[a][b][c][d][p][1∼4]\}(if\ q==0)\)
注意实现细节
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
register LL x=0,f=1;register char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
return f*x;
}
double f[14][14][14][14][5][5];
int t1,t2,t3,t4;
inline double dp(int a,int b,int c,int d,int p,int q){
if(f[a][b][c][d][p][q]) return f[a][b][c][d][p][q];
register double &ans=f[a][b][c][d][p][q];//double &ans的操作
register int x1=a,x2=b,x3=c,x4=d;
if(p==1)x1++;if(p==2)x2++;if(p==3)x3++;if(p==4)x4++;//王的记录
if(q==1)x1++;if(q==2)x2++;if(q==3)x3++;if(q==4)x4++;
if(x1>=t1&&x2>=t2&&x3>=t3&&x4>=t4) return 0;//已经到达
int sum=54-x1-x2-x3-x4;
if(sum<=0) return ans=INF;//不可能
if(a<13) ans+=dp(a+1,b,c,d,p,q)*(13-a)/sum;//注意要乘上概率
if(b<13) ans+=dp(a,b+1,c,d,p,q)*(13-b)/sum;
if(c<13) ans+=dp(a,b,c+1,d,p,q)*(13-c)/sum;
if(d<13) ans+=dp(a,b,c,d+1,p,q)*(13-d)/sum;
if (!p){
double t=dp(a,b,c,d,1,q);
t=min(t,dp(a,b,c,d,2,q));
t=min(t,dp(a,b,c,d,3,q));
t=min(t,dp(a,b,c,d,4,q));
ans+=t/sum;//用王代替最优解
}
if (!q){
double t=dp(a,b,c,d,p,1);
t=min(t,dp(a,b,c,d,p,2));
t=min(t,dp(a,b,c,d,p,3));
t=min(t,dp(a,b,c,d,p,4));
ans+=t/sum;
}
return ++ans;//需要拿一张牌才能转移到下一步
}
int main(){
t1=read(),t2=read(),t3=read(),t4=read();
double Ans=dp(0,0,0,0,0,0);
if(Ans>=INF) Ans=-1;
printf("%.3lf\n",Ans);
}
[CH3803] 扑克牌 (期望DP+记忆化搜索)的更多相关文章
- 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索
[题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...
- BZOJ1415 [Noi2005]聪聪和可可 【SPFA + 期望dp记忆化搜索】
题目 输入格式 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...
- bzoj 1415: [Noi2005]聪聪和可可 期望dp+记忆化搜索
期望dp水题~ 你发现每一次肯定是贪心走 2 步,(只走一步的话就可能出现环) 然后令 $f[i][j]$ 表示聪在 $i$,可在 $j$,且聪先手两个人碰上面的期望最小次数. 用记忆化搜索转移就行了 ...
- luogu P4206 [NOI2005]聪聪与可可 期望dp 记忆化搜索
LINK:聪聪与可可 这道题的核心是 想到如何统计答案. 如果设f[i][j]表示第i个时刻... 可以发现还需要统计位置信息 以及上一次到底被抓到没有的东西 不太好做. 两者的位置都在变化 所以需要 ...
- 洛谷4206/NOI2005T4 聪聪和可可 期望DP+记忆化搜索
题意:给出n个点m条边的无向图,两个主角聪聪和可可开始分别在S点和T点.聪聪想吃掉可可,每次由匆匆先行动后来可可行动.聪聪的行动是选他到可可的最短路上的点走最多两步(如果最短路有几条就选编号最小的走) ...
- bzoj 1415 期望dp + 记忆化搜索
思路:这个题看着感觉不能dp,其实是可以dp的,因为狼每次走两步,兔子每次走一步,每进行一轮以后,狼和兔子的距离 肯定是在接近的,没有相同的状态,dp之前预处理出来,每一步狼该往哪里走. #inclu ...
- 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索
题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...
- [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树
树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...
- poj1664 dp记忆化搜索
http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...
随机推荐
- c/c++中关于String类型的思考
首先说明:String并不是一种内置类型,因此任何通过String声明出来的实例都不是一个变量,不同于内置类型因此String仅仅能称之为一种特殊的型别,没错String是一个类类型. 一般来说c语言 ...
- HttpMessageConverter和ContentNegotiatingViewResolver
HttpMessageConverter 在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换,HttpMessa ...
- Go 网络编程笔记
前言: 本文是学习<<go语言程序设计>> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请 ...
- Mysql设计索引的原则
内容来自书籍<深入浅出MySQL++数据库开发.优化与管理维护+第2版+唐汉明> 设计索引的原则1. 搜索的索引列,不一定是所要选择的列.换句话说,最适合索引的列是出现在 WHERE 子句 ...
- 【转载】MySQL常用系统表大全
转载地址:http://blog.csdn.net/xlxxcc/article/details/51754524 MySQL5.7 默认的模式有:information_schema, 具有 61个 ...
- 团体程序设计天梯赛L2-013 红色警报 2017-03-23 22:08 55人阅读 评论(0) 收藏
L2-013. 红色警报 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 战争中保持各个城市间的连通性非常重要.本题要求你编写一 ...
- 学习python2
字符串遍历 列表遍历 元组遍历 字典遍历 <1> 遍历字典的key(键) <2> 遍历字典的value(值) <3> 遍历字典的项(元素) <4> 遍历 ...
- C#中匿名函数、委托delegate和Action、Func、Expression、还有Lambda的关系和区别
以前一直迷迷糊糊的,现在总算搞明白. Lambda表达式 Lamda表达式基本写法是()=>{ };Lambda和方法一样都可以传入参数和拥有返回值.(int x)=>{return x; ...
- MySQL数据库(四)
操作数据库表的内容: -- 向表中插入数据:insert into table_name values(now(),'a'); insert into student (id,name,sex) va ...
- webapi发布常见错误及解决方案
webapi发布常见错误及解决方案 错误一: 错误:404 (Not Found) 解决方案: 在 <system.webServer>节点中添加如下模块: <modules ru ...