• 网格


    BZOJ3907 网格

    某城市的街道呈网格状,左下角坐标为 A(0,0)A(0,0),右上角坐标为 B(n,m)B(n,m),其中 n≥mn≥m。现在从 A(0,0)A(0,0) 点出发,只能沿着街道向正右方或者正上方行走,且不能经过图示中直线左上方的点,即任何途径的点 (x,y)(x,y) 都要满足 x≥yx≥y,请问在这些前提下,到达 B(n,m)B(n,m) 有多少种走法。

    解析:卡特兰数。(1,2,5,14,42,132......)当卡特兰数不明显时,可通过打表找规律

    典型例子:

    从(0,0)走到(n,n)且不经过直线y=x的路线数量

    另右移为0,上移为1,则问题转化为由n个0和n个1排成的,任意前缀中0都不少于1的序列数量(卡特兰数)

    所以总方案数为Catn*2

    从(0,0)走到(n,n)且不接触直线y=x的路线数量

    用卡特兰数很容易解决:(第一步也可以走到(1,0),我们只需算出一种,另一种*2即可)第一步肯定到了(0,1),且最后一步肯定到了(n,n-1),故总方案数为Catn-1(乘2)

    我们也可以利用对称的思想解决这两个问题(这个思想也是解决本题的关键所在):

    从(0,0)走到(n,n)且不接触直线y=x的路线数量

    从(1,0)走到(n,n-1),如果不考虑接触直线的问题,那么总方案数为C(n-1,2n-2),(1,0)关于直线y=x的对称点为(0,1)

    从(0,1)走到(n,n-1)一定会经过直线y=x,这于从(1,0)经过y=x再走到(n,n-1)的路径数是相等的,所以满足题意的方案数为(C(n-1,2n-2)-C(n,2n-2))(Catn-1)(乘2)

    从(0,0)走到(n,n)且不经过直线y=x的路线数量

    这个问题等价于不接触直线y=x+1,所以过(0,0)作关于直线y=x+1的对称点(-1,1),从(-1, 1)到点(n, n)必定接触y=x+1,方法数为C(2n - 1, 2n),所以符合要求的方法数为:C(n, 2n) - C(2n - 1,2n) = C(n, 2n) - C(2n + 1,2n) = Cat(n)(乘2)

    接下来终于到了这道题的解法:

    过(0,0)作关于直线y=x+1的对称点(-1,1),过(0,0)且接触直线y=x+1的方案数等于从(-1,1)的方案数

    C(n+1,n+m),从(0,0)到(n,m)的总方案数为C(n,n+m),所以答案的方案数为C(n,n+m)-C(n+1,n+m)

    (也可用对称矩形的方法来解决此题,而且正确性更易证明)

    因为不会写高精,所以没有代码

  • 相关阅读:
    最详细易懂的CRC-16校验原理(附源程序)(转)
    深入理解Java的接口和抽象类(转)
    同步、更新、下载Android Source & SDK from 国内镜像站(转载)
    django字段查询参数及聚合函数
    django不返回QuerySets的API
    django查询集API
    django查询操作
    django用包来组织模型
    django模型的继承
    django模型的元数据Meta
  • 原文地址:https://www.cnblogs.com/Akaina/p/11243681.html
Copyright © 2020-2023  润新知