觉得这题很有必要讲一下!

现在发现在做概率题,基本是向 dp 和 马尔可夫链 靠齐

但是这一题真是把我坑了,因为状态太多,马式链什么的直接死了

我一开始的想法就是用 f[i][j] 表示剩余 i 个人,现由 j 坐庄

恩~ dp 方程还是老好想的嘛~

wait! wait!! wait!!! 这尼马有后效性啊!有后效性啊!!

然后想了半天毫无进展,一看题解……

哎呦我 c

其实那个方程几乎对了,但!是!有后效性就要用重标号的方法去掉!

怎么算去了呢?

其实……谁是谁更本不重要!

如果我们对每个人 i 都重标号为 0 ,列一次方程,那么每次都只算第 0 个人 (变为 0~n-1 个人) 存活的概率 即 f[1][0] 即可

所有方程的区别只在边界条件不同而已,标号什么的完全不用管,也就没有后效性了!

然后我们只要保证 0 不 over 即可,其他的都可以不用管了

若这一轮的标号是 0~i , 然后第 j 个人 over 的话

新标号为 0~i-1, 但是这里的 j~i-1 其实是原来的 j+1~i

但是我们不用去管标号变了的问题,因为本质上是一样的

f[i][(j+a[k]-1)%(i+1)]+=f[i+1][j]/M

这么写就可以了,但是还有个问题:

0 是不能被删的我们注意到在 f[i+1] -> f[i] 时

f[i][0] 其实是 0 被删去后 1 变为 0 坐庄的概率

但 0 存活到了最后,这是无法取的(事实上若 0 活到了最后,1 就不可能坐庄)

那么 f[i][0] 其实是什么呢?

f[i][i]!

因为这是一个环,在剩余 i+1 个人时,删掉了第 i 个人,在坐庄时当然由第 0 人来,这时所有人都没有被重标号

 #include <cstdio>
#include <cstring>
const int sizeOfPlayer=;
const int sizeOfCard=; inline int getint(); int N, M;
int a[sizeOfCard];
double f[sizeOfPlayer][sizeOfCard]; int main()
{
N=getint(), M=getint();
for (int i=;i<M;i++)
a[i]=getint(); for (int p=;p<N;p++)
{
memset(f, , sizeof(f));
f[N][(N-p)%N]=1.0;
for (int i=N-;i;i--)
{
for (int j=;j<=i;j++)
for (int k=;k<M;k++)
f[i][(j+a[k]-)%(i+)]+=f[i+][j]/M;
f[i][]=f[i][i];
} if (p) putchar(' ');
printf("%.2lf%%", f[][]*);
} putchar('\n'); return ;
} inline int getint()
{
register int num=;
register char ch;
do ch=getchar(); while (ch<'' || ch>'');
do num=num*+ch-'', ch=getchar(); while (ch>='' && ch<='');
return num;
}

说的不清楚还请见谅

[BZOJ 3191][JLOI 2013]卡牌游戏的更多相关文章

  1. JLOI 2013 卡牌游戏

    问题描述: N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先 ...

  2. JLOI 2013 卡牌游戏 bzoj3191

    题目描述 N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随机(即按相等的概率)从卡牌堆里选择一张卡片,假设卡片上的数字为X,则庄家首先把 ...

  3. bzoj千题计划202:bzoj3191: [JLOI2013]卡牌游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=3191 每个人获胜的概率只与其在排列中与庄家的相对位置有关 dp[i][j] 还剩i个人时,从庄家数第 ...

  4. BZOJ 4392 卡牌游戏

    Description 奶牛贝茜是卡牌游戏的狂热爱好者, 但是令人吃惊的, 她缺乏对手. 不幸的是, 任何牧 群里的其他牛都不是好对手. 他们实在是太差了 , 实际上, 他们玩卡牌游戏时会遵循一种完全 ...

  5. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  6. BZOJ_3191_[JLOI2013]卡牌游戏_概率DP

    BZOJ_3191_[JLOI2013]卡牌游戏_概率DP Description   N个人坐成一圈玩游戏.一开始我们把所有玩家按顺时针从1到N编号.首先第一回合是玩家1作为庄家.每个回合庄家都会随 ...

  7. 洛谷 P2059 [JLOI2013]卡牌游戏 解题报告

    P2059 [JLOI2013]卡牌游戏 题意 有\(n\)个人玩约瑟夫游戏,有\(m\)张卡,每张卡上有一个正整数,每次庄家有放回的抽一张卡,干掉从庄家起顺时针的第\(k\)个人(计算庄家),干掉的 ...

  8. 【BZOJ3191】【JLOI2013】卡牌游戏 [DP]

    卡牌游戏 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description   N个人坐成一圈玩游戏.一开始我 ...

  9. TCG卡牌游戏研究:《炉石战记:魔兽英雄传》所做的改变

    转自:http://www.gameres.com/665306.html TCG演进史 说到卡牌游戏,大家会联想到什么呢? 是历史悠久的扑克牌.风靡全球的<MTG 魔法风云会>与< ...

随机推荐

  1. Servlet入门

    1.在tomcat中新建一个day01web应用,然后在web应用中新建一个web-inf/classes目录:2.在classes目录中新建一个FirstServlet.java文件:package ...

  2. Android Fragment (二) 实例2

    由于看客的要求,我就把读者所要的写出来. 由于上一篇是每一个Fragment 实例了同一个layout.xml ,造成了读者的困惑,这篇我就让每一个Fragment 加载一个不同的layout.xml ...

  3. Android Fragment (一)

    1.Fragment的产生与介绍   Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视.针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改布局以 ...

  4. 上架到AppStore?第一次上架之路

    首先,用自己的Developer账户(个人付费),登陆Developer的Acount(注册证书到电脑上这一步以前就做过了,虽然忘了,但是百度上有教程,以后要注册再补-!) 打开证书管理Certifi ...

  5. LeetCode Reorder List

    struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; class Solution ...

  6. Convert

    Person p=teacher as person; If (p!=null ) dostring (); 使用这样的方法效率高 使用 is时 进行两次判断效率低

  7. Oracle对列的操作总结

    1.更改列名 alter table TABLE_NAME rename column COLUMN_OLD COLUMN_NEW; 2.添加列 alter table TABLE_NAME add ...

  8. MySQL日期时间函数大全 转

    DAYOFWEEK(date)  返回日期date是星期几(1=星期天,2=星期一,……7=星期六,ODBC标准)mysql> select DAYOFWEEK('1998-02-03');  ...

  9. 从零开始学习Node.js例子八 使用SQLite3和MongoDB

    setup.js:初始化数据库 var util = require('util'); var async = require('async'); //npm install async var no ...

  10. appium+Python真机运行测试demo的方法

    appium+Python真机运行测试demo的方法 一,    打开手机的USB调试模式 二,    连接手机到电脑 将手机用数据线连接到电脑,并授权USB调试模式.查看连接的效果,在cmd下运行命 ...