首页 > 编程语言 >算法学习笔记(32): 格路径与计数

算法学习笔记(32): 格路径与计数

时间:2023-10-29 09:58:46浏览次数:27  
标签:... 那么 32 路径 len 计数 算法 choose binom

格路径与计数

这属于组合数学里面的东西,单独拿出来谈上一谈。

最简单的计数:从 \((0, 0)\) 只能向右或者向左走到 \((n, m)\)。

首先有一个很 naive 的 DP:\(f_{i, j} = f_{i - 1,j} + f_{i, j - 1}\)。

然而如果我们稍微变换一下坐标,旋转 45 度,那么递推式变为:\(g_{k, j} = g_{k - 1, j} + g_{k - 1, j - 1}\),这与 \(n \choose i\) 何其相似,所以可以得到 \(g_{k, j} = {k \choose j}\),也就是说 \(f_{i, j} = g_{i + j, i} = {i + j \choose j}\)。

是否能够换一个通用的方式理解?

要走到 \(n + m\),那么一共需要走 \(n + m\) 步,而其中横走 \(n\) 步,在其中选择 \(n\) 个位置横着走,那么方案数就是 \({n + m \choose n}\)。

那么现在,如果我们可以斜着走,也就是走到 \((i + 1, j + 1)\),那么路径数如何?

还是考虑最基本的 DP,\(f_{i, j} = f_{i - 1, j} + f_{i, j - 1} + f_{i - 1, j - 1}\),这下变换坐标观察就啥也观察不出来。

不妨考虑枚举斜着走的步数,如果走了 \(x\) 步,那么横着和竖着走的步数就分别变为了 \(n - x, m - x\),这又归约为了上一个问题,但是什么时候斜着走?发现只需要在原本的行走路径上随便插入 \(x\) 步斜着的都是合法的。

于是最终的路径数为 \(\sum_{d = 0}^{\min(n, m)} \binom{n + m - 2d}{n - d} \binom{n + m - d}{d}\)。

这还不够,在学习卡特兰数的时候,其与格路径的关系非常密切:不超过对角线到 \((n, n)\) 的路径数。

如果简单推广一下,不超过对角线到 \((n, m)\) 该如何计数?(这里不妨设 \(n \ge m\))

考虑简单容斥,一共有 \(n + m \choose n\) 条路径,而不合法的?

我们将不超过 \(y = x\) 这条线的限制改为不经过 \(y = x + 1\) 这条线。

对于每一条经过了 \(y = x + 1\) 的路径,我们将第一次经过前的部分关于 \(y = x + 1\) 对称一下,那么起点就变为了 \((-1, 1)\)。不难发现,\((-1, 1) \to (n, m)\) 的路径与不合法的路径一一对应,所以不合法的路径数为 \(n + m \choose n + 1\),最终的答案即是 \(\binom {n + m} n - \binom{n + m}{n + 1}\),这是符合卡特兰数的。

这种翻折的思路正是大名鼎鼎的折线法,之后还会提及。

继续加强,可以走斜对角线呢?那么发现斜对角线不会影响路径的合法性,所以枚举斜着走的步数,剩下的就和前面一样了。

然而我们不会满足于不超过 \(y = x\) 这条简单的线的限制,如果是不超过 \(y = x + k\) 该何去何从?

还是折线法,但是对称的线变了,变成了 \(y = x + k + 1\) (注意特判一下本就一定超过的情况)

继续,如果考虑上不过 \(y = x + a\),下不过 \(y = x + b\) 又该如何?

现在就是大名鼎鼎的折线容斥(呃,反射容斥)了

如果简单的利用上面的做法,那么会发现我们重复计算了同时经过 \(a, b\) 的情况,所以要减去,但是会发现会多减去经过 \(aba\) 或者 \(bab\) 的线段,又要加上……

如此往复,直到对称着对称着没有值了,那么就胜利了(这是一定可以越界的!)

形式化来说,设序列 \(xyxyx...\) 表示经过两者的顺序,那么方案数为 \(\binom{n + m}{n} + \sum_{len = 1} (-1)^{len} abab... + \sum_{len = 1} (-1)^{len} baba...\)

其中 \(len\) 表示 \(abab...\) 序列的长度。而直接求这个是 \(O(\log n)\) 的,非常的优秀。

重新回到格路径,这样子分析怪简单的,能不能再抽象一点?

显然是可以的,这就上升到生成函数了,这就确实抽象了。

标签:...,那么,32,路径,len,计数,算法,choose,binom
From: https://www.cnblogs.com/jeefy/p/17795482.html

相关文章

  • 算法学习笔记(-∞): 信息学,学习和考试,我当如何?
    杂项2此杂项主要记录关于考试和竞赛习惯的部分内容,与知识本身无关。考试习惯使用vim和命令行,在NOILinux下测试。写代码的时候就应该加上调试语句,每写一部分应当立即测试有没有挂。很多时候很可能忽略\(0\)的情况,需要大力注意边界,这在数学中同样适用。很多时......
  • 计算图架构原理与算法分析
    计算图架构原理与算法分析这些节点和主题的图表,以及它们的连接方式,经常被称为计算图。计算图的可视化,可以帮助我们了解有哪些节点,以及它们如何互相沟通。ROS提供了一个工具,叫做rqt_graph,可以显示系统的计算图。计算图管道-RFCSOC硬件通常包括多个异构芯片组,例如XilinxUltra......
  • ABC326
    此前也没有写一整场比赛题解的习惯,那就从现在开始吧。D:简单的一道题,直接搜就行了。代码:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;template<classT>boolchmax(T&a,constT&b){if(a<b){a=b;returntrue;}returnfalse;}template<c......
  • 统计数字出现的次数
    输入一个长度不超过100000位的整数,接下来再输入n个询问,每个询问输入整数l,r,x。对于每个询问,输出原数中从第l位数到第r位数中x出现的次数。【数据范围】1≤l≤r≤10^5,1≤n≤10^5,0≤x≤9输入格式第一行包含一个整数n。第二行是一个不超过100000位的整数。接下来n行,每行......
  • AtCoder Beginner Contest 326
    A-2UP3DOWN(abc326A)题目大意100楼层,一次可以上最多两层,或下最多三层。给定两楼层,问能否一次到达。解题思路比较大小,然后判断其差是是不是在\(2\)或\(3\)内即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){......
  • ABC326
    上次说我的写法low的人的AT号在这里!!(我又来提供low算法了。从D开始。T4我们把\(\text{A}\)看成\(1\),把\(\text{B}\)看成\(2\),把\(\text{C}\)看成\(3\)。那么就可以想到状压,然后把每一行和每一列的情况状态即可。#include<bits/stdc++.h>usingnamespacestd;......
  • AtCoder Beginner Contest 326 题解
    首先,\(\text{HappyBirthdaytome!}\)A-2UP3DOWN常规ABCA...//If,oneday,Ifinallymanagetomakemydreamsareality...//Iwonder,willyoustillbetherebymyside?#include<bits/stdc++.h>#defineIOSios::sync_with_stdio(false)#defineTI......
  • 20231327 司宏林《计算机基础与程序设计》第5周学习总结
    学期(2023-2024-1)学号(20231327)《计算机基础与程序设计》第5周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2023-2024-1计算机基础与程序设计第5周作业)这个作业的目标<关于机器语......
  • ESP32S3通过Arduino移植LVGL
    原文:https://www.jianshu.com/p/8306f948b854LVGL展示此lvgl开发板开源链接: 准备工作显示屏驱动,需要用到“画点”或者“画区域”函数触摸驱动,如果需要用到触摸功能,还需要准备触摸函数,该函数将会返回触摸坐标给lvgl修改lvgl下载下来的lvgl是不能直接使用的,需要......
  • 2023-2024-1 20231329《计算机程序与设计》第五周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK05这个作业的目标计算机科学概论第6章并完成云班课测试《C语言程序设计》第4章并完成云班课测试......