• 一个简单的问题
  • level 0
  • level 1
  • level 2
  • level 2 Plus
    • 插播一条来自Catalan的紧急新闻
  • level 3
  • level 3 Plus
  • 棋盘还有话要说

一个简单的问题

问从一个横边长为m,竖边长为n方格棋盘的一个角走到对角点的最短路径共有多少种方法?这个问题应该会有很多人见到过,想明白的话这也是一个很简单的问题,但是如果在这个问题上进行一点小小的改变,这个问题也是可以很有意思的。

level 0

方便起见就不失一般性的假设棋盘大小是4*3:

那么问题就是从左下角到右上角的路经数目有多少?
一种思路就是用动态规划的思想,到格子(i,j)处的只有两种方法:从(i-1,j)向右走一步或者从(i,j-1)处向上走一步。用N(i,j)表示从起点到(i,j)的路径数,则:

N(i,j)=N(i-1,j)+N(i,j-1)

所以这个3*4的棋盘问题可解:

但是说的高大上是动态规划算法,说的不好听了不就是傻算嘛……换一个角度考虑就能转化成一个高中就能瞬间写出答案的问题,其实就是一种选择的问题。因为在每个路口都要做出选择,是向上还是向右走。就好像我高中骑车上学一样。假设我家在左下角(0,0),学校在右上角(4,3)。那么我可以先向右骑一段路,到路口(1,0),我可以选择向东直行到(2,0)或者左拐到(1, 1)处,每一个路口都要做出选择,但是全程我必须也只能向北走三段路,同理向东走四段路,即在全程长为7的路程中选择三段路向北走,四段路向东走。
例如(U U R U R R R )或者(R U R U R U R)或者(R R R R U U U)都是可能的路径。(U表示向上走,R表示向右走)。
所以总路程数就是:

C(7,3) = C(7,4) = 35

同理从(0,0)点走到(m,n)处的路线数就是C(m+n,n)或者C(m+n,m)。

level 1

好!小棋盘升级了!现在我们的问题改变了,在一个m*m正方形棋盘上从角点(0,0)走到对角线上的最短路线有多少种?

升了一级也没感觉怎么样嘛!每一个路口有2种向上向右两种走法,走m步,共2m2^m种路线。就拿这个9*9的图来说,答案就是292^9呗!so easy!我想说的是,除了这一个思路,用level 0的想法解这道题。
从上往下,到达第一个点的路径数目是C(9,0),到达第二个点的路径数目是C(9,1),依次类推,到达第i个点的路径数目是C(9,i-1),这里 i 的取值区间是大于等于0,小于等于9。也就是说,总共的路径数是:

∑9i=0C(9,i)\sum_{i=0}^9C(9,i)

这十个值分别是1,9,36,84,126,126,84,36,9,1,而如果把这个计算过程写下来的话,我们会发现这不就是杨辉三角嘛!

—(图片来自百度,侵删)—

杨辉三角形可以用来解释二项式定理:

(u+r)m=um+C(m,1)um−1r+C(m,2)um−2r2+……+rm(u+r)^m=u^m+C(m,1)u^{m-1}r+C(m,2)u^{m-2}r^2+……+r^m

这里没有通常的x和y而是用u和r来表示,是因为在这里u表示向上走,r表示向右走。ukrm−ku^kr^{m-k}的项表示共走m步,其中向上走了k步,其余时候向右走。而项前面的系数表示这种走法共有多少种可能性,在上式中将m=9带入,就是我们上述的解。令u=r=1,整个式子的和为512。
杨辉三角又名Pascal三角形,还有很多有趣的性质,比如和斐波那契数列的联系,与题无关不赘述。

level 2

前面上了两个战五渣热身,现在大家是不是觉得战斗力满满,想打十个!接下来的就是精英棋盘了!现在的棋盘变成了这个样子:

在这个9*9的棋盘中我们从起点走到终点,限制是不允许走红色的区间内,也就是说可以是走在起点到终点的连线上的。老司机一看可能就知道:啊!好办!这不就是卡塔兰数嘛!直接上公式啊:

Cn=C(2n,n)/(n+1)C_n=C(2n,n)/(n+1)

直接带入n=9计算得到Cn为4862!bingo!回答正确!但是一是可能很多童鞋不知道catalan数或者没想到可以使用catalan数,另一方面,假设题目要求稍作变动,Catalan数也不能简单的解决这个问题了比如下例。

level 2 Plus


这个棋盘发现自己可以直接被公式解决很不开心,于是把终点挪了挪,现在就不能直接套用Catalan数了。题目要求还和之前一样,不许走到红色区域内部,求最短路径数有多少?
我们可以考虑,这道题要求我们从(0,0)处走到(9,6)处。而第一步我们只能向右走到(1,0)位置。所以从(0,0)点出发到重点的线路数目和从(1,0)点出发的线路数目是一样的。而且,从(1,0)点出发到终点的所有最短线路中,有进入红色区域和不进入红色区域两种路线。那么这道题的就变成了求解从(1,0)点出发的到达终点的所有路线减去从(1,0)点出发的途径红色区域内部到达终点的路线。但是这么看的话,问题不但没有变得简单,反而需要求的量更多了。
然而从(1,0)点出发的所有路线我们是可以通过level 0的结论立刻得知的。那经过红色区域的路线数目呢?

我们的要求是不能进入红色区域内部,也就是说红色细线上面的点可以经过,而红色粗线上面的点是不允许碰的。而我们只要求出所有S点到终点的路径中与红色粗线相交的数目就可以了。
可以进行这样的转化,每一条S到终点与红色粗线相交的路线都可以转化为T到终点的一条路线。转化方式就是设P是路径与红色粗线相交的第一个点。把S-P的一段路线关于红色粗线进行轴对称到T-P即可。一旦有了这种一一对应关系,我们也就如下计算:
Ans = 起点到终点不进入红色区域的路径数
= S点到终点不进入红色区域的路径数
= S点到终点所有路径数 - S点到终点与红色粗线相交的路径数
= S到终点路径数 - T到终点路径数
= C(14,6)- C(14,4)
= 2002
由于这是level 2 plus的解法,当然去搞level 2也是so easy。用这种方法去解level 2的话:C(17,8)- C(17,7)= 24310 - 19448 = 4862。

插播一条来自Catalan的紧急新闻

Catalan数实际是一种非常有趣也变化多端的递推序列,这里不详细地讲他的公式了。有很多种形式的题目实际都是Catalan公式的变形应用,这里只给出我印象深刻的一个例子,是我在考研复习时看到的。说一个长为n的字符串和一个栈,整个字符串经过出栈入栈可以有多少种字符串。
比如:abc这个字符串,经过(入入入出出出)的堆栈处理顺序得到cba,若是经过(入出入出入出)得到abc……
总的可能性就是卡塔兰数,实际上这个(入出…….)这个序列可以转化为在棋盘途中的(上右……)的一个路径,所以可以相互转化。
网上还有很多例子,什么卖票呀,加括号啊。殊途同归。

level 3

俗话说得好,流水的学生,铁打的题型。(敢问这是哪里的俗话。。。)打倒了一个棋盘,还会有千千万万个棋盘站起来!

又回到最初的起点,又是那个9*9的方格棋盘。不过岁月是把杀猪刀,让咱走了这么多遍,棋盘也受不了,现在L1、L2和L3几段路路面维修,禁止通行,那么现在问从起点到终点有多少种最短路径啊?
最短路径啊?
短路径啊?
路径啊?
径啊?
啊!!!
(╯°Д°)╯︵ ┻━┻

好,诸位先把桌子捡回来,然后继续看这道题!
这道题其实仔细想想并不难呀,就是总的路径数减去经过L1的,经过L2的和经过L3的呗,有一个小陷阱是分别减的时候可能会有重复减去的部分。可以参考下面这段小学奥数题。

一个班有48人,班主任在班会上问:“谁做完语文作业?请举手!”有37人举手。又问:“谁做完数学作业?请举手!”有42人举手。最后问:“谁语文、数学作业都没有做完?”没有人举手。求这个班语文、数学作业都完成的人数。

如果大家都想起了被童年时期奥数题所支配的恐惧了,那么这道题也可以解了。所求路径数就是:总路径数 - 过L1路径数 - 过L2路径数 - 过L3路径数 + 过L1L2路径数 + 过L1L3路径数 + 过L2L3路径数 - 过L1L2L3路径数。这里不写计算过程了,我计算的答案要是没错的话是26312。

level 3 Plus

然而故事并没有就这么结束。(求求你结束吧。)我们的棋盘君知耻后勇。(我要是能像棋盘这么上进就好了。)他发现自己被小学奥数参赛选手解出来非常羞愤(太敏感了吧!),于是题目变成了这样:

诶?
是的!你没有看错!图还是那张图,但是背景故事已经变了!(噗!)现在L1,L2,L3不是修路了,而是三个麦当劳汽车餐厅,你从左下角的家去右上角的公司上班,途中要经过三个汽车餐厅的一个而且只能经过一个,比如在L1这条路上的麦当劳汽车餐厅买完东西之后就不许去L3了,因为一般这三条路上车比较多,你怕堵车。那么现在问题来了!最短路径有多少条。。。
当然了,可以计算经过L1不经过另外两个,另外两个也这么计算,然后加到一起可以求解。可是这么一点没有逼格。这里也不多说废话了,解这道题的工具是广义容斥原理。(弄了半天还是要容斥原理来解!)容斥原理解决的是几个集合的并集,也就是说有很多性质,我们可以用容斥原理求至少满足一个性质的元素数目。而广义容斥原理可求解恰好满足i个性质的元素数目。
在这就不深究原理与证明了,广义容斥原理用到两个变量:


且直接定义α(0)\alpha(0) = 性质数
直接使用这个工具:
设A是经过L1的路径集合,B是经过L2的路径集合,C是经过L3的路径集合,则:

α(0)\alpha(0) = C(18,9) =48620(就是总路径数,不考虑任何限制)
α(1)\alpha(1) = |A|+|B|+|C| = 7056+9240+10296 = 26592
α(2)\alpha(2) = |AB|+|AC|+|BC| = 1512+2772 = 4284
α(3)\alpha(3) = 0

然后通过α\alpha计算β\beta

β(0)\beta(0) = 48620-26592+4284-0 = 26312
β(1)\beta(1) = 26592-2*4284 = 18024
β(2)\beta(2) = 4284
β(3)\beta(3) = 0

然后β(i)\beta(i)表示的就是恰好满足i个性质的元素数,这道题中标示的就是恰好通过i条红色路径的数目。我们想求的答案就是β(1)\beta(1) = 18024.为了验证我们也可以将所有的beta加到一起就等于alpha(0),而且beta(0)的意思是不通过红色路径数,也的确是我们上一题的答案。
注:这其实是由beta的计算方法决定的,将beta纵向排开可以发现它的系数构成一个杨辉三角哦。

棋盘还有话要说

写这篇文章其实是因为最近学了一些组合数学的皮毛,感觉挺有趣也挺深奥。文章其实并没有多少自己的东西,只是把各个部分的知识点串到一起而已,写在这也只是可以起到复习的作用。数学方面我是小白,如有错误尽管拍砖。如果有时间后面会再写几篇文章。


参考资料:
《组合数学》(第三版) 作者:卢开澄 卢华明

方格路径问题升级之路相关推荐

  1. 京东横刀,堵了拼多多“升级”的路

    文|潇雅 来源 | 潇湘财经(XiaoxiangFin) 1 商品流也有价值体系 今年的4月是个多事之秋,自快手.火山小视频被下架后,内容资讯领域掀起了一番整改的腥风血雨.先是快手宿华的诚恳道歉,到今 ...

  2. 划重点!《企业数字化升级之路》白皮书讲了哪些干货?

    在企业管理界,对数字化转型的认同正在成为决策者中的普遍共识. 如果说2019年是中国各行各业追赶数字化转型激烈的一年,那么在经历2020年真枪实弹的演练后,管理者们对数字化转型已经形成了更为成熟理性的 ...

  3. 网易创新企业大会倒计时2天 《企业数字化升级之路》白皮书将发布

    在数字技术不断迭代并转化为生产工具的今天,越来越多的企业面向未来提前布局数字化转型,以求在数字经济时代的市场竞争中立于不败之地.为了与各行各业就数字化转型的实践和创新进行深入交流,网易旗下一站式企业服 ...

  4. Transformer升级之路:二维位置的旋转式位置编码

    ©PaperWeekly 原创 · 作者 | 苏剑林 单位 | 追一科技 研究方向 | NLP.神经网络 在之前的文章 Transformer 升级之路:博采众长的旋转式位置编码中我们提出了旋转式位置 ...

  5. Transformer升级之路:Sinusoidal位置编码追根溯源

    ©PaperWeekly 原创 · 作者|苏剑林 单位|追一科技 研究方向|NLP.神经网络 最近笔者做了一些理解和改进Transformer的尝试,得到了一些似乎还有价值的经验和结论,遂开一个专题总 ...

  6. 【架构】需求决定架构 —— 萌Mark的架构升级之路

    前言 2014年到2015年,是IP爆发的一年,在这一年中,出现很多因为IP火起来的产品.其中有一款产品,凭借着新奇的玩法和萌萌的IP形象,取得了不俗的成绩,也使我司得到数量客观的融资. 萌Mark, ...

  7. 扫地机器人的技术升级之路 自主规划清扫成主流

    人工智能时代正朝我们快步走来,将全面影响我们生活的方方面面,近年来,沉浸已久的扫地机器人也迎来了爆发式增长,除了消费升级与懒人时代的到来,技术升级也是促使扫地机器人市场爆发的重要因素. 扫地机器人的技 ...

  8. 跨越敏捷 — 闲鱼研发效能升级之路

    摘要: 在2018第二届研发效能嘉年华专场上,来自阿里巴巴集团研发效能张燎原为听众带来了<跨越敏捷 - 闲鱼研发效能升级之路>的精彩分享.在分享中,他从以业务为导向的跨职能协作.按需求进行 ...

  9. 刷题笔记之十 (小易的升级之路+找出字符串中第一个只出现一次的字符+洗牌+MP3光标位置)

    目录 1.存取任意指定序号的元素和在最后进行插入和删除运算,利用顺序表存储最节省时间 2. 数据结构中具有记忆功能的是栈 3. 递归程序的优化一般为 尾递归优化 4.二叉树遍历,前中后序遍历用到的是栈 ...

最新文章

  1. Oracle的介绍及其在安装和使用Oracle过程中可能遇到的困难及其相应的解决措施
  2. Amy Mcdonald - This is the Life
  3. 历年双11实战经历者:我们是如何做数据库性能优化及运维-CloudDBA和天象
  4. springboot java.util.NoSuchElementException: No value present 异常处理
  5. python测试udp端口_Linux系统的ECS实例中TCP/UDP端口测试及验证方法说明
  6. PHP的JSON封装
  7. mysql active_GitHub - vipshop/drc: MySQL active-active replication solution.
  8. 利用awstats分析nginx日志 简单配置
  9. Bootstrap的下拉列表点击没有用
  10. 蓝桥杯 ADV-148算法提高 排队打水问题(贪心)
  11. SSE图像算法优化系列十四:局部均方差及局部平方差算法的优化。
  12. import pymysql 没有模块_python模块与包
  13. qt 隐藏控制台_QT去掉CONSOLE | 学步园
  14. 网易云ncm转mp3
  15. 2019觉得工作很难找?来成都网优谷学点技术吧,小老弟!
  16. 淘宝美工掌握这4种能力,不逊色于UI设计师
  17. linux安装liinuxrar教程,linux操作系统下RAR的安装和使用
  18. 湖南计算机应用技术专科学校排名,湖南所有职业技术学院排名
  19. 在键盘上输入数n,编程计算sum=1!+2!+··· + n!的结果
  20. Java之-MyBatis

热门文章

  1. 法兰洗头哥的Linux妙妙屋
  2. 运维之道 | 三剑客之sed命令 - 增删改查排
  3. 数字面板表行业调研报告 - 市场现状分析与发展前景预测
  4. 计算机网络第二章(谢希仁第八版)
  5. 计算机辅助药物设计在新药研发中的应用
  6. Android接入SRS WebRtc直播流
  7. 基于Java后台(Springboot框架)+前端小程序(MINA框架)+Mysql数据库的旅游景区景点购票小程序系统设计与实现
  8. 历史上敢和皇帝争女人的六大色鬼
  9. TCP FACK 与 RACK
  10. 清华数据结构列车调度AC100分