【题解】CF#24 D-Broken Robots

  在某次考试的时候用过的办法,懒人必备……【笑哭】

  一个非常显然的 dp,我们用 \(f[i][j]\) 表示第 \(i\) 行第 \(j\) 列的格子走到最后一排的期望步数转移即为

\(f[i][j] = \frac{f[i][j - 1] + f[i][j + 1] + f[i + 1][j] + f[i][j]}{4} + 1\)

略微的化一下简:

\(f[i][j] = \frac{f[i][j - 1] + f[i][j + 1] + f[i + 1][j] + 4}{3}\)

  (当然,对于 j = 1 和 j = m 的情况是另外两个式子,但推导的方法是一样的)。这个式子使用高斯消元优化一下就能搞定,然而非常悲伤,像我这样的蒟蒻写高斯消元常常写挂,也不是很敢码。那怎么办办呢?人工大法好啊!

  我们可以注意到行与行之间是不会相互转移的,我们可以认为当前行的 dp 数组为 f,下一行的 dp 数组为 g。那么对于 \(f[i][m]\) 而言,我们有

\(f[m] = \frac{f[m - 1] + g[m] + 3}{2}\)

也就是说,我们可以用 \(f[i - 1]\) 来表示出 \(f[i]\) 的值!

那么每从 \(f[j] -> f[j - 1]\),我们都可以得到一个递推式

\(f]j] = k * f[j - 1] + t\)

那么这个式子递归到尽头 f[1] 的时候

我们陡然发现式子中的未知数只剩下了一个 f[1]!

此时,只需不断回代就能得到 f[2 ... m]。

  复杂度 \(O(n * m)\) ,非常优秀是吧~

#include <bits/stdc++.h>
using namespace std;
#define maxn 1050
#define db double
int n, m, S, T;
db f[maxn][maxn];

int read()
{
    int x = 0, k = 1;
    char c; c = getchar();
    while(c < ‘0‘ || c > ‘9‘) { if(c == ‘-‘) k = -1; c = getchar(); }
    while(c >= ‘0‘ && c <= ‘9‘) x = x * 10 + c - ‘0‘, c = getchar();
    return x * k;
}

void DP(int p, int x, db k, db t)
{
    if(!x) return;
    if(x == 1)
    {
        f[p][x] = (f[p + 1][x] + 3.0 + t) / (2.0 - k);
        return;
    }
    db k1 = 1 / (3.0 - k), t1 = (f[p + 1][x] + 4.0 + t) / (3.0 - k);
    DP(p, x - 1, k1, t1);
    f[p][x] = f[p][x - 1] * k1 + t1;
}

int main()
{
    n = read(), m = read(), S = read(), T = read();
    for(int i = n - 1; i >= 1; i --)
    {
        db k = 0.5, t = 0.5 * (3.0 + f[i + 1][m]);
        DP(i, m - 1, k, t);
        if(m == 1) f[i][m] = f[i + 1][m] + 2.0;
        else f[i][m] = k * f[i][m - 1] + t;
    }
    printf("%.10lf\n", f[S][T]);
    return 0;
}

原文地址:https://www.cnblogs.com/twilight-sx/p/9909899.html

时间: 2024-10-10 10:34:08

【题解】CF#24 D-Broken Robots的相关文章

【题解】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)\)的复杂度我们接受不了. 式子里面的

题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T5(思维)

还是dfs? 好像自己写的有锅 过不去 看了题解修改了才过qwq #include <cstdio> #include <algorithm> #include <cstring> #include <stack> #include <set> using namespace std; int u[200010],v[200010],n,m,k,ans; bool isdel[200010],vis[200010]; set<int>

Leetcode题解(24)

73. Set Matrix Zeroes 分析:如果没有空间限制,这道题就很简单,但是要求空间复杂度为O(1),因此需要一些技巧.代码如下(copy网上的代码) class Solution { public: void setZeroes(vector<vector<int> > &matrix) { bool bColZero = false, bRowZero = false; if (matrix.size() == 0 || matrix[0].size() =

heartbeat安装与配置

Hearbeat和keepalived区别 Keepalived使用的vrrp协议方式,虚拟路由冗余协议 (Virtual Router Redundancy Protocol,简称VRRP): Heartbeat是基于主机或网络的服务的高可用方式: keepalived的目的是模拟路由器的双机 heartbeat的目的是用户service的双机 lvs的高可用建议用keepavlived 业务的高可用用heartbeat Heartbeat高可用介绍 Heartbeat,心跳的意思,这里是Li

#puppet#新版puppet的问题

tips:检查puppet版本: puppet --version 我安装的版本是3.7.4 最近因为安装了saltstack,不知道为什么salt执行命令很慢(CPU使用率高),又暂时找不到什么解决方案(怀疑是bug),于是滚回puppet的世界 参考了这篇资料,安装了puppet:https://docs.puppetlabs.com/guides/install_puppet/install_debian_ubuntu.html 分别在master和agent上安装了puppetmaste

读者的梦想,图书馆员的梦魇

作者:鱼鸟兽 链接:https://zhuanlan.zhihu.com/p/21602568 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 一本无法被数字化的书 <S.>包含了两个世界:印刷的世界和书写的世界.在印刷的世界,也就是由旧书<忒修斯之船>及其所构成的故事里,充满了各种谜题:失忆的主角.被禁言的船员.神秘的女子,还有故事的创作者--作家石察卡和他的译注者柯岱拉.所有的元素之间有什么联系?<忒修斯之船>并没有给我们答案. 珍

Linux无密码登录SFTP

目录(?)[-] 概述 SFTP免密码登录操作方法 1 登陆服务端主机在当前用户根目录执行以RSA算法为例 2 将服务端的homesshid_rsapub文件上传到客户端机的homessh目录下 3将客户端各主机信息添加到homesshknown_hosts文件中 说明 实操 ssh特别慢故障 概述 Public Key认证的主要魅力在于认证时承诺不必提供密码就能够同远程系统建立连接. Public Key认证的基础在于一对密钥,public key和private key,public key

第十章 企业项目开发--分布式缓存Redis(2)

注意:本章代码是在上一章的基础上进行添加修改,上一章链接<第九章 企业项目开发--分布式缓存Redis(1)> 上一章说了ShardedJedisPool的创建过程,以及redis五种数据结构的第一种String类型的常用缓存操作方法.下面说余下的四种: list(有序列表) set(无序集合) sorted set(有序集合) hash 1.ssmm0-cache 1.1.RedisListUtil(有序列表工具类) 1 package com.xxx.cache.redis; 2 3 im

Matplotlib初体验

为一个客户做了关于每个差异otu在时间点上变化的折线图,使用python第一次做批量作图的程序,虽然是很简单的折线图,但是也是第一次使用matplotlib的纪念. ps:在第一个脚本上做了点小的改动,加上了分类信息作为图的标题,加上网格便于对照y轴丰度值,x轴的名称更加接近样品的实际名称. 1 from __future__ import division 2 import numpy as np 3 import matplotlib.pyplot as plt 4 from matplot