题目链接

参考一下这的.

\(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)的更多相关文章

  1. HDU 3853LOOPS(简单概率DP)

    HDU 3853    LOOPS 题目大意是说人现在在1,1,需要走到N,N,每次有p1的可能在元位置不变,p2的可能走到右边一格,有p3的可能走到下面一格,问从起点走到终点的期望值 这是弱菜做的第 ...

  2. HDU - 1099 - Lottery - 概率dp

    http://acm.hdu.edu.cn/showproblem.php?pid=1099 最最简单的概率dp,完全是等概率转移. 设dp[i]为已有i张票,还需要抽几次才能集齐的期望. 那么dp[ ...

  3. HDU 4405 【概率dp】

    题意: 飞行棋,从0出发要求到n或者大于n的步数的期望.每一步可以投一下筛子,前进相应的步数,筛子是常见的6面筛子. 但是有些地方可以从a飞到大于a的b,并且保证每个a只能对应一个b,而且可以连续飞, ...

  4. HDU 4576 Robot(概率dp)

    题目 /*********************复制来的大致题意********************** 有N个数字,M个操作, 区间L, R. 然后问经过M个操作后落在[L, R]的概率. * ...

  5. HDU 4599 Dice (概率DP+数学+快速幂)

    题意:给定三个表达式,问你求出最小的m1,m2,满足G(m1) >= F(n), G(m2) >= G(n). 析:这个题是一个概率DP,但是并没有那么简单,运算过程很麻烦. 先分析F(n ...

  6. [HDU 4089]Activation[概率DP]

    题意: 有n个人排队等着在官网上激活游戏.Tomato排在第m个. 对于队列中的第一个人.有以下情况: 1.激活失败,留在队列中等待下一次激活(概率为p1) 2.失去连接,出队列,然后排在队列的最后( ...

  7. hdu 3853 LOOPS 概率DP

    简单的概率DP入门题 代码如下: #include<iostream> #include<stdio.h> #include<algorithm> #include ...

  8. HDU 3853 期望概率DP

    期望概率DP简单题 从[1,1]点走到[r,c]点,每走一步的代价为2 给出每一个点走相邻位置的概率,共3中方向,不动: [x,y]->[x][y]=p[x][y][0] ,  右移:[x][y ...

  9. HDU 3366 Passage (概率DP)

    题意:T组测试数据,一个人困在了城堡中,有n个通道,m百万money ,每个通道能直接逃出去的概率为 P[i] ,遇到士兵的概率为 q[i], 遇到士兵得给1百万money,否则会被杀掉,还有 1-p ...

随机推荐

  1. Java远程访问接口的几种方式

    一.Java访问远程url接口并获取结果 1.原生JavaAPI获取 package com.util; import java.io.DataOutputStream; import java.io ...

  2. bzoj千题计划187:bzoj1770: [Usaco2009 Nov]lights 燈 (高斯消元解异或方程组+枚举自由元)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1770 a[i][j] 表示i对j有影响 高斯消元解异或方程组 然后dfs枚举自由元确定最优解 #in ...

  3. 何凯文每日一句打卡||DAY5

  4. 从数据库存储,文件结构谈到B树,散列

    昨天俱乐部内部办了一个讲座,关于常规数据库系统实现,听了之后有点混乱,于是花了很多时间特地查了一些资料,基本上自己感觉自己是明白了.特地写下来. 文章开头说明三点, 第一点,本文针对常规数据库,是为了 ...

  5. .NET面试题系列(六)多线程

    1.多线程的三个特性:原子性.可见性.有序性 原子性:是指一个操作是不可中断的.即使是多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰. 比如,对于一个静态全局变量int i,两个线程同 ...

  6. javascript命名空间

    命名空间:命名空间有助于减少程序中所需要的全局变量的数量,并且同时还有助于避免命名冲突或过长的名字前缀. 板栗: var MYAPP = MYAPP || {}; MYAPP.namespace = ...

  7. nagios使用问题的解决方案

    通过web界面修改某个服务时报错例如对某个服务进行临时安排其执行时间,或者不让它发警告,web页面上都有这样的设置.但是常常会有错误信息如下: Could not open command file ...

  8. HDOJ题目分类

    模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 104 ...

  9. csu 1930 roads(DFS)

    Description Once upon a time there was a strange kingdom, the kingdom had n cities which were connec ...

  10. [转] 使用moment.js轻松管理日期和时间

    当前时间:moment().format('YYYY-MM-DD HH:mm:ss'); 2017-03-01 16:30:12 今天是星期几:moment().format('d'); 3 Unix ...