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 ...
随机推荐
- Spring整合Quartz定时任务 在集群、分布式系统中的应用(Mysql数据库环境)
Spring整合Quartz定时任务 在集群.分布式系统中的应用(Mysql数据库环境) 转载:http://www.cnblogs.com/jiafuwei/p/6145280.html 单个Q ...
- Java中多个异常的捕获顺序(多个catch)
import java.io.IOException; public class ExceptionTryCatchTest { public void doSomething() throws IO ...
- Java迭代器用法
public class Test01 { public static void main(String[] args) { List list = new ArrayList(); list.add ...
- ASP.NET MVC学习笔记-----Filter(1)
Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter AuthorizeAttribute 最先执行,在其他类型的fi ...
- 一些js的小技巧
这里收集了一些编码上的小技巧,大家可以学习学习. 1.浮点转整型 使用|0快速转换 var a=(12.002)|0;//12 使用~~快速转换 ~取反运算符,2=0010,~2=1101,因为第一位 ...
- Spring Tool Suite 创建 SpringMVC+Maven 项目(一)!
使用Spring Tool Suite 创建 SpringMVC Web 项目,使用Maven来管理依赖! 首先对环境进行必要的配置 1. 配置必要的Java JDK版本! (菜单栏-窗口-首选项.) ...
- java学习第04天(语句、函数、数组)
(3)循环结构 格式: for(初始化表达式,循环条件表达式,循环后的操作变大时){ 执行语句,循环体: } 注: a. for循环里面的连个表达式运行的顺序,初始化表达式只读一次,判断循环条件,为真 ...
- iOS编码规范参考
目录 注释 1.1 多行注释 1.2 单行注释 1.3 函数的注释 命名 2.1 常量的命名 2.2 函数的命名 2.3 变量的命名 2.3.1 成员变量 2.3.2 公 ...
- json转化数组
//json格式数据 $data = '[{ "F_ModuleId": "1", "F_ParentId": "0", ...
- 第10月第21天 手势识别 开屏广告 Xcode快捷键
1.手势识别 http://yulingtianxia.com/blog/2016/12/29/Multimedia-Edit-Module-Architecture-Design/ 2.开屏广告 h ...