【题解】CF24D Broken Robots(收敛性)

【题解】CF24D Broken Robots

http://codeforces.com/problemset/problem/24/D

解1

获得一个比较显然的转移式子

\(dp(i,j)\)代表在\((i,j)\)坐标需要期望的走的次数
\[
dp(i,j)=0.25(1+dp(i-1,j)+dp(i,j-1)+dp(i,j+1))
\]
然而我们可以发现这个式子不满足无后效性..也找不到一种合适的顺序DP。

我们发现可以高斯消元,但是\(O(n^4)\)的复杂度我们接受不了。

式子里面的\(dp(i-1,j)\)是上一行的事情,不需要考虑,直接转移即可,我们把\(dp(i,j)\)抽象为\(x_j\)

那么我们考虑的是。
\[
x_j=0.25(1+l_j+x_{j-1}+x_{j+1})
\]
写成划一下
\[
-0.25x_{j-1}+x_j-0.25x_{j+1}=0.25l_j+0.25
\]
写成矩阵
\[
\begin{pmatrix}
1&-0.25&0& 0&0&0&0.25l_1+0.25
\-0.25&1&-0.25& 0&0&0&0.25l_2+0.25
\0&-0.25&1&-0.25&0&0&0.25l_3+0.25
\0&0&-0.25&1&-0.25&0&0.25l_4+0.25
\0&0&0&-0.25&1&-0.25&0.25l_5+0.25
\0&0&0&0&-0.25&1&0.25l_6+0.25
\end{pmatrix}
\]
魔改一下高斯消元即可。

解2

众所周知,概率函数具有收敛性。 并且是指数地收敛的。又因为期望的式子里有概率作为因子,所以它应该是收敛的。(其实不是应该!是一定!若概率收敛则期望收敛(特殊情况除外),具体说明可以把概率和随机变量分开DP!)

好,既然我们已经知道了这个函数具有收敛性,那么我们就让他在每一行就多转移几次就好了。具体操作就是让每个点按照顺序每次从左边转移过来一次,从右边转移过来一次。重复这个步骤随便多少次就好了。

由于精度只要\(10^{-4}\),我们只需要\(\log_{\frac 1 3}10^{-4}=9\)次就好了。注意,这里的"概率函数的收敛"性是抽出一行看的,不能在转移的时候把自己的\(0.25\)和上一行的\(0.25l\)加进来,不然显然是个发散的函数。

为了方便统计答案,我们反着dp,毕竟从最后一行到起点的期望步数=从起点到最后一行的期望步数。

\(dp(i,j)\)表示从最后一行到这一点\((i,j)\)的期望步数。

转移:
\[
dp(i,j)=1/dr[i][j]\times (dp[i+1][j]+dp[i][j-1,j,j+1])+1
\]

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;  typedef long long ll;
inline int qr(){
      register int ret=0,f=0;
      register char c=getchar();
      while(c<48||c>57)f|=c==45,c=getchar();
      while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
      return f?-ret:ret;
}
const int maxn=1e3+5;
typedef long double lb;
lb dp[maxn][maxn],ans;
const lb qt[]={0,(lb)1.0/1,(lb)1.0/2,(lb)1.0/3,(lb)1.0/4};
int cnt;
int n,m;
int x,y;
int main(){
      n=qr();m=qr();
      x=qr();y=qr();
      const int lit=50000000/(m)/(n-x+1);
      for(register int t=n-1;t>=x;--t){
        for(register int t0=1;t0<=lit;++t0){
          if(m>1)
            dp[t][1]=qt[3]*(dp[t+1][1]+dp[t][2]+dp[t][1])+1,dp[t][m]=qt[3]*(dp[t+1][m]+dp[t][m-1]+dp[t][m])+1;
          if(m==1) dp[t][1]=qt[2]*(dp[t][1]+dp[t+1][1])+1;
          for(register int i=2;i<m;++i)
            dp[t][i]=qt[4]*(dp[t+1][i]+dp[t][i-1]+dp[t][i]+dp[t][i+1])+1;
        }
      }
      cout.precision(10);
      cout<<dp[x][y]<<endl;
      return 0;
}
//18.0038068653

原文地址:https://www.cnblogs.com/winlere/p/10958862.html

时间: 2024-10-10 10:33:25

【题解】CF24D Broken Robots(收敛性)的相关文章

CF24D Broken robot(高斯消元)

CF24D Broken robot(高斯消元) 高斯消元新玩法 一眼期望\(dp\), 考虑逆推因为第\(n\)层的期望是确定的(都是\(0\)), \(F[x][y]\)表示从第\(x\)行第\(y\)列开始到第\(n\)层的期望步数 转移方程: \[ F[x][y] = (F[x][y] + F[x][y+1] + F[x][y-1] + F[x+1][y]) / 4 + 1 ~~(y ~!= 1 \&y~!=m)\\F[x][y] = (F[x][y] + F[x][y+1] + F[x

从TCP拥塞本质看BBR算法及其收敛性(附CUBIC的改进/NCL机制)

本文试图给出一些与BBR算法相关但却是其之外的东西. 1.TCP拥塞的本质 注意,我并没有把题目定义成网络拥塞的本质,不然又要扯泊松到达和排队论了.事实上,TCP拥塞的本质要好理解的多!TCP拥塞绝大部分是由于其"加性增,乘性减"的特性造成的!        也就是说,是TCP自己造成了拥塞!TCP加性增乘性减的特性引发了丢包,而丢包的拥塞误判带来了巨大的代价,这在深队列+AQM情形下尤其明显.        我尽可能快的解释.争取用一个简单的数学推导过程和一张图搞定.       

同号级数收敛性的判别法

     1.一般概念   对于数值级数:$a_1+a_2+\cdots+a_n+\cdots=\sum\limits_{n=1}^{\infty}a_n $                      ① 若存在有穷极限: $\lim\limits_{n\to\infty}S_n=S$(级数和) 其中  $S_n=a_1+a_2+\cdots+a_n,$ 则级数①称为收敛的.反之,级数①称为发散的. 2.柯西准则   级数①收敛的充要条件是:对于任何$\varepsilon>0 $都存在$N=N

51nod1674:区间的价值2(分治,利用&amp;和|的收敛性)

lyk拥有一个区间. 它规定一个区间的价值为这个区间中所有数and起来的值与这个区间所有数or起来的值的乘积. 例如3个数2,3,6.它们and起来的值为2,or起来的值为7,这个区间对答案的贡献为2*7=14. 现在lyk有一个n个数的序列,它想知道所有n*(n+1)/2个区间的贡献的和对1000000007取模后的结果是多少. 例如当这个序列为{3,4,5}时,那么区间1,11,1,1,21,2,1,31,3,2,22,2,2,32,3,3,33,3的贡献分别为9,0,0,16,20,25.

牛顿法及其收敛性

目录 0. 引论 2. 牛顿法 2.1 单变量牛顿法 2.2 多变量牛顿法 3. 简化牛顿法 3.1 平行弦法 3.2 牛顿下山法 0. 引论 在工程中,很多的问题都可以归结为求解一组偏微分方程组.描述如下:在某一个区域\(\Omega\)中,物理量\(u={u_1,u_2,\cdots,u_n}\)满足一组控制方程,并且在边界上满足若干的边界条件: 控制方程利用两个微分算子来表示\(A(u),B(u)\). \[ A(u)=\begin{cases} A_1(u)& =0 \A_2(u)&

CF24D Broken robot | DP 高斯消元

题目链接 直接$dp$会有后效性,用高斯消元解决. 因为在这道题中列出的增广矩阵很有特点,所以用$O(M)$的时间复杂度就可以解出来. 注意$m=1$时的情况. #include<iostream> #include<cstdio> using namespace std; double f[1005][1005],g[1005][1005]; int main() { int n=0,m=0,x=0,y=0; scanf("%d%d%d%d",&n,&

CF24D Broken robot

题意翻译 你收到的礼物是一个非常聪明的机器人,行走在一块长方形的木板上.不幸的是,你知道它是坏的,表现得相当奇怪(随机).该板由n行和m列的单元格组成.机器人最初是在i行和j j列的某个单元格上.然后在每一步机器人可以到另一个单元.目的是去底层(n次)行.机器人可以停留在当前单元,向左移动,向右边移动,或者移动到当前下方的单元.如果机器人在最左边的列不能向左移动,如果它是在最右边的列不能向右移动.在每一步中,所有可能的动作都是同样可能的.返回步的预期数量达到下面的行. 一道好好地高斯消元被打成了

【题解】CF575I Robots Protection

CF 官网链接 CF.ML 链接 \(N \le 5000, Q \le 10^5\) \(N \le 3 \times 10^5, Q \le 3 \times 10^5\) 思路 这是一道二维数点题. 只考虑 \(dir = 1\),记一个三角形直角顶点 \((p, q)\) ,直角边长 \(r\) 考虑斜边的限制,斜边的方程是 \(x + y = p + q + r\) 所以如果一个三角形对询问有贡献,记询问点 \((x, y)\) ,则\(x + y \in [p + q, p + q

一阶非线性常微分方程解的存在性定理—Picard-Lindelof定理

上一节简单介绍了可求解的一阶常微分方程的解法,因为大部分非线性方程是不可解的,所以需要给出解的存在性的证明.本节主要介绍一阶非线性常微分方程Cauchy问题$$(E)\,\,\,\,\,\frac{dy}{dx}=f(x,y),\,\,\,\,\,y(x_{0})=y_{0}.$$解的存在性定理Picard-Lindelof定理(有的书上称它为Cauchy-Lipschitz定理). 对一阶常微分方程解的存在性理论作出重要贡献的数学家有Cauchy.Lipschitz.Picard.Lindel