目录
题目概述
题目背景:
疫情期间,小明要去超是买零食,可他不希望遇到疫情……
题目描述:
在一个边长为n的网格上,小明从(0,0)出发,到(n−1, n−1)买菜,小明每次可以沿着一条边走一步。可是疫情很严重,在(0,0)和(n−1, n−1)有一条安全线,安全线的左上部为危险区域,不可以走。例如下图中,蓝色为不可取路线,而绿色为可取路线。求小明有多少条到菜场的最短路径。
输入格式:
共一行,一个正整数n
输出格式:
输出小明到菜场的最短路条数。
样例输入:
4
样例输出:
14
提示说明:
数据范围:
样例
N≤
分值(个)
1-2
20
5
3-5
5000
6
6-8
100000
10
9-10
259571
21
注:此题目为洛谷私人题库,不得抄袭。
若需要提交代码,请到
U374955 三角走 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
解析:
方法一:28 points
花n2的时间来一个一个标数
程序自然很简单,这里不进行详细说明
方法二:100 points
我们先来分析一下这个题目。
易得到:正确走法=总走法 – 犯罪走法。
而总走法用C2nn就可以得到了!
俗话说的好,人生总是在后半生犯罪,但如果反转一下,就成了一个不错的人生。
我们随便找一个非法的走法,并将它已对角线反转(除最后一步)。如下图:
绿色:原来路线 蓝色:反转路线 紫色:最后一步
然后,把最后一步接在反转后的最后一步的后面:
此时,这个犯法的到(n – 1,n – 1)的路径被转化为了一个随意到(n, n – 2)的路径了!
显然,每一个到(n, n – 2)均可以转化为一个非法路径且包含了所有,所以犯法路径 =到(n, n – 2)的任意路径,即为C 2nn - 1或C2nn + 1。
所以,合法总路径的个数=C2nn - C 2nn – 1。
然后,我们去简化这个式子,并得出一个递推式:
然后,最重要的代码实现:
注:无脑抄题解必挂!这里有两处错误!
最终算法时间复杂度:O(n)
考虑到数值较大,我们不做跟加大的数据。
接着,我们来深入探讨一下这种数的特性
其实就是:卡特兰数