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

现在发现在做概率题,基本是向 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. Vue.js的计算属性

    开始用vue会把所有的模版上的数据都放到data属性里,或者有的时候data属性里变量多了之后觉得有些只是用一次的变量就直接写到模版里了,后来看到同组的同事在用computed属性,就又去查了一下ap ...

  2. 触发Full GC执行的情况

    除直接调用System.gc外,触发Full GC执行的情况有如下四种. 1. 旧生代空间不足 旧生代空间只有在新生代对象转入及创建为大对象.大数组时才会出现不足的现象,当执行Full GC后空间仍然 ...

  3. GitHub 上一份很受欢迎的前端代码优化指南

    http://segmentfault.com/a/1190000002587334?utm_source=weekly&utm_medium=email&utm_campaign=e ...

  4. ASP.NET空网页生成默认代码注释

    当在Visual Studio下生成ASP.NET空网页时,默认生成代码: <%@ Page Language="C#" AutoEventWireup="true ...

  5. NOIP 考前 Tarjan复习

    POJ 1236 给定一个有向图,求: 1) 至少要选几个顶点,才能做到从这些顶点出发,可以到达全部顶点 2) 至少要加多少条边,才能使得从任何一个顶点出发,都能到达全部顶点 第一个就是缩点之后有多少 ...

  6. (转载)android炫酷实用的开源框架(UI框架)

    可以实现一些场常用炫酷效果,包含android-lockpattern(图案密码解锁).Titanic(可以显示水位上升下降的TextView).Pull-to-Refresh.Rentals-And ...

  7. 实时控制软件设计 第二次作业 myRobot

    #include<iostream> #include <Eigen/Dense> #include <math.h> #include <vector> ...

  8. Intellj IDEA Java随笔

    敲击sout+Tab会出现:System.out.println(); int(-2147483648, 2147483647) 当一个方法类型不是void时,那么我们不仅要考虑它正确时的返回值,错误 ...

  9. mysql 添加用户并授权

    mysql> create database dogDB; mysql> CREATE USER 'dog'@'%' IDENTIFIED BY '123456'; mysql> g ...

  10. 浅谈fls3的一个压缩问题

    昨天,用fis3压缩优化,在命令行运行命令的时候,出现了一个报错信息. not a PNG file. 查了很多资料,没找到解决方案,终于在github上提问,有正主回答: 是由于有些图片的后缀是通过 ...