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

2×N网格最大路径和动态规划Python代码优化咨询

优化方案与分析

首先先指出原代码里的一个冗余问题:第一个循环里dp[1][0] = dp[0][0] + B[0]被放在了range(1, N)的循环里,每次循环都重复赋值,完全没必要,应该把这行代码移到第一个循环外面。

核心优化:空间复杂度从O(N)降到O(1)

原代码用了一个2×N的二维数组存储状态,但实际上我们只需要几个变量就能记录必要的状态,不需要保存所有位置的历史值:

  • 用sum_a记录A行走到当前位置的累计和(对应原dp[0][i])
  • 用prev_b记录B行走到前一个位置的累计和(对应原dp[1][i-1])
  • 用curr_b记录B行走到当前位置的累计和(对应原dp[1][i])

优化后的代码如下:

def max_path_sum(A, B):
    N = len(A)
    if N == 0:
        return 0
    # 初始化:A行第一个位置的和,以及B行第一个位置的和
    sum_a = A[0]
    prev_b = sum_a + B[0]
    
    for i in range(1, N):
        # 更新A行到当前位置的累计和
        sum_a += A[i]
        # 计算B行当前位置的最大和:要么从B的前一个位置向右来,要么从A的当前位置向下跳过来
        curr_b = max(prev_b + B[i], sum_a + B[i])
        # 更新prev_b为当前值,用于下一次循环
        prev_b = curr_b
    
    return prev_b

优化效果说明

  1. 空间优化:原代码需要O(N)的空间存储dp数组,优化后只需要O(1)的额外空间,对于超大N(比如百万级)的场景,内存占用会大幅降低。
  2. 时间效率:时间复杂度保持O(N),和原代码一致,但减少了原代码中重复赋值的冗余操作,实际运行速度会略有提升。
  3. 可读性提升:变量名更直观,逻辑更紧凑,没有多余的数组操作。

验证逻辑正确性

优化后的代码逻辑和原代码完全一致:

  • A行的累计和sum_a就是原dp[0][i],一直向右累加
  • B行每个位置的最大和,要么是从左边B的位置走过来(prev_b + B[i]),要么是从当前A的位置跳下来(sum_a + B[i]),取两者最大值,和原dp[1][i] = max(dp[1][i-1]+B[i], dp[0][i]+B[i])逻辑一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 21:16:02