HDU.5819.Knights(概率DP)
参考一下这的.
\(Description\)
数轴上有n个骑士,分别位于1,2,3,...,n,它们的移动速度相同,初始移动方向已知。当两个骑士相遇时,各有50%的概率获胜,失败的骑士就死了。
当骑士移动到0,n+1位置时方向会反转。求最右边的骑士最后存活的概率。
\(Solution\)
题目中速度、时间都是无关紧要的。第n个骑士若要赢,一定是打败了左边所有存活的骑士。
那么设\(f[i][j]\)表示前i个骑士中有j个骑士存活的概率。
考虑怎么求。第i个骑士如果向左,那它应把前i-1个骑士中k-j个向右的骑士都打败(然后go_die->1/2),才能剩下j个.
即\(f[i][j]=\sum_{k=j}^{i-1}f[i-1][k]*(\frac{1}{2})^{k-j+1}\)
把\(k=j\)时的分离出来,可以化简为$$f[i][j]=\frac{1}{2}(f[i-1][j]+f[i][j+1])$$
如果骑士i向右,那么$$f[i][j]=f[i-1][j-1]$$
但是如果只有一个骑士向右,还可能是它打败了左边所有骑士,到0点折回的。
所以给每个\(f[i][1]+=\sum_{j=1}^{i-1}f[i-1][j]*(\frac{1}{2})^j\)
即$$(f[i][1]+=\frac{1}{2}(f[i-1][1]+f[i][2]))=f[i-1][1]+f[i][2]$$
最终答案\(Ans=\sum_{i=1}^{n-1}f[n-1][i]*(\frac{1}{2})^i\),即$$Ans=\frac{f[n][1]}{2}$$
注意骑士n是要强制向左走的(本来就是)。
#include <cstdio>
#include <cctype>
#include <cstring>
#define gc() getchar()
#define inv (500000004)
#define mod (1000000007)//除以2全都化为乘逆元(题目要求),这样也能直接用整数
const int N=1005;
int n,f[N][N];
inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
int main()
{
int T=read();
for(int cas=1; cas<=T; ++cas)
{
memset(f,0,sizeof f);
n=read(), read();
f[1][1]=1;
for(int i=2; i<=n; ++i)
{
if(read()&&i!=n)
for(int j=1; j<=i; ++j)
f[i][j]=f[i-1][j-1];
else{
for(int j=i-1; j>1; --j)
f[i][j]=1ll*inv*(f[i-1][j]+f[i][j+1])%mod;
f[i][1]=(f[i-1][1]+f[i][2])%mod;
}
}
printf("Case #%d: %I64d\n",cas,1ll*f[n][1]*inv%mod);
}
return 0;
}
HDU.5819.Knights(概率DP)的更多相关文章
- HDU 3853LOOPS(简单概率DP)
HDU 3853 LOOPS 题目大意是说人现在在1,1,需要走到N,N,每次有p1的可能在元位置不变,p2的可能走到右边一格,有p3的可能走到下面一格,问从起点走到终点的期望值 这是弱菜做的第 ...
- HDU - 1099 - Lottery - 概率dp
http://acm.hdu.edu.cn/showproblem.php?pid=1099 最最简单的概率dp,完全是等概率转移. 设dp[i]为已有i张票,还需要抽几次才能集齐的期望. 那么dp[ ...
- HDU 4405 【概率dp】
题意: 飞行棋,从0出发要求到n或者大于n的步数的期望.每一步可以投一下筛子,前进相应的步数,筛子是常见的6面筛子. 但是有些地方可以从a飞到大于a的b,并且保证每个a只能对应一个b,而且可以连续飞, ...
- HDU 4576 Robot(概率dp)
题目 /*********************复制来的大致题意********************** 有N个数字,M个操作, 区间L, R. 然后问经过M个操作后落在[L, R]的概率. * ...
- HDU 4599 Dice (概率DP+数学+快速幂)
题意:给定三个表达式,问你求出最小的m1,m2,满足G(m1) >= F(n), G(m2) >= G(n). 析:这个题是一个概率DP,但是并没有那么简单,运算过程很麻烦. 先分析F(n ...
- [HDU 4089]Activation[概率DP]
题意: 有n个人排队等着在官网上激活游戏.Tomato排在第m个. 对于队列中的第一个人.有以下情况: 1.激活失败,留在队列中等待下一次激活(概率为p1) 2.失去连接,出队列,然后排在队列的最后( ...
- hdu 3853 LOOPS 概率DP
简单的概率DP入门题 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #include ...
- HDU 3853 期望概率DP
期望概率DP简单题 从[1,1]点走到[r,c]点,每走一步的代价为2 给出每一个点走相邻位置的概率,共3中方向,不动: [x,y]->[x][y]=p[x][y][0] , 右移:[x][y ...
- HDU 3366 Passage (概率DP)
题意:T组测试数据,一个人困在了城堡中,有n个通道,m百万money ,每个通道能直接逃出去的概率为 P[i] ,遇到士兵的概率为 q[i], 遇到士兵得给1百万money,否则会被杀掉,还有 1-p ...
随机推荐
- Spark记录-Scala数组
Scala提供了一种数据结构叫作数组,数组是一种存储了相同类型元素的固定大小顺序集合.数组用于存储数据集合,但将数组视为相同类型变量的集合通常更为有用. 可以声明一个数组变量,例如:numbers,使 ...
- Linux命令(四)文件传输
1. 将当前目录下的test1.txt文件,复制到 /tmp/Douzi目录下,命名为test1.py 2. 将服务器/tmp/Douzi/hello.py复制到本地上,重命名为 hello_Do ...
- AngularJs -- 模 块
在JavaScript中,将函数代码全部定义在全局命名空间中绝对不是什么好主意,这样做会导致冲突从而是调试变得非常困难,浪费宝贵的时间. 上一章介绍数据绑定时,就是写在全局命名空间中定义的函数. 在A ...
- 关于z-index这个层级的问题
z-index它可真是一个神奇的东西,它可以随意安排你的层的叠加问题. 如你想让红色矩形压在蓝色矩形上,正常布局先建立一个红色的再建议一个蓝色的,就可以了. 但如果我相反来建立,那么就得借助z-ind ...
- 2016-2017-2 20155309 南皓芯java第六周学习总结
教材内容详解 这一次主要学习的是第十章与第十一章的内容.主要讲述了串流,字符处理和线程以及并行API. 输入输出 串流:Java中的数据有来源(source)和目的地(destination),衔接两 ...
- python中的__new__、__init__和__del__
__new__.__init__.__del__三个方法用于实例的创建和销毁,在使用python的类中,我们最常用的是__init__方法,通常称为构造方法,__new__方法几乎不会使用,这篇文章是 ...
- CF989C A Mist of Florescence (构造)
CF989C A Mist of Florescence solution: 作为一道构造题,这题确实十分符合构造的一些通性----(我们需要找到一些规律,然后无脑循环).个人认为这题规律很巧妙也很典 ...
- mybatis开发dao的方法——(三)
------------------------1. SqlSession使用范围------------------- 1.1 SqlSessionFactoryBuilder 通过S ...
- atom使用markdown
atom使用markdown 最近因为不喜欢博客园自身带的编辑工具,所以尝试使用markdown,目前只是想简单的把标题和内容分的开一些,以后在慢慢熟悉吧 1.atom上安装markdown 在没有外 ...
- linux命令中which、whereis、locate有什么区别?
1.find find是最常用和最强大的查找命令.它能做到实时查找,精确查找,但速度慢. find的使用格式如下: #find [指定目录] [指定条件] [指定动作] 指定目录:是指所要搜索的目录和 ...