You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

三角形网格中(0,0)到(2n,0)的迭代式路径总数求解

三角形网格路径计数的迭代实现方案

你要解决的是三角形网格中从(0,0)到(2n,0)的可行路径计数问题,这类路径的核心约束是不能走到j<0的位置(仅i+j为偶数的点存在,j为负时无对应点),每一步只能是向上(j+1)或向下(j-1),总步数为2n,其中恰好n次向上、n次向下——这本质对应第n个卡特兰数。

你的伪代码存在的问题

  • 逻辑与参数不符:函数参数(i,j)不符合需求(应该传入n),路径数组A的构建逻辑错误,且用全排列枚举路径会产生大量重复(因为有n个相同的1和n个相同的-1),n稍大就会性能爆炸。
  • 语法与判断错误:i!是非法写法,前缀和判断sum(A[1:i]) < 0逻辑错误(应该检查每一步的累计和都≥0),集合操作set.append(path)不符合语法。
  • 效率极低:全排列的复杂度是O((2n)!),完全不适合n≥5的场景。

正确的迭代实现(动态规划)

这种方法通过状态转移直接计数,避免枚举所有路径,效率更高:

def count_paths(n):
    # dp[h] 记录当前步数下,到达高度h的路径数量
    dp = {0: 1}  # 初始状态:0步,在高度0,路径数为1
    
    for _ in range(2 * n):
        next_dp = {}
        for current_h, path_count in dp.items():
            # 向上走一步,到达current_h + 1
            next_h = current_h + 1
            next_dp[next_h] = next_dp.get(next_h, 0) + path_count
            
            # 向下走一步,只有当前高度>0时才合法(避免走到j=-1)
            if current_h > 0:
                next_h = current_h - 1
                next_dp[next_h] = next_dp.get(next_h, 0) + path_count
        
        dp = next_dp
    
    # 返回2n步后到达高度0的路径总数
    return dp.get(0, 0)

更高效的迭代实现(卡特兰数公式)

因为问题本质是卡特兰数,我们可以直接用卡特兰数的递推公式迭代计算,时间复杂度O(n),空间复杂度O(1):

def count_paths_catalan(n):
    catalan = 1
    for i in range(1, n + 1):
        catalan = catalan * (4 * i - 2) // (i + 1)
    return catalan

内容的提问来源于stack exchange,提问作者CWT_Simon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 11:31:04