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
优化效果说明
- 空间优化:原代码需要O(N)的空间存储dp数组,优化后只需要O(1)的额外空间,对于超大N(比如百万级)的场景,内存占用会大幅降低。
- 时间效率:时间复杂度保持O(N),和原代码一致,但减少了原代码中重复赋值的冗余操作,实际运行速度会略有提升。
- 可读性提升:变量名更直观,逻辑更紧凑,没有多余的数组操作。
验证逻辑正确性
优化后的代码逻辑和原代码完全一致:
- 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
相关产品推荐
相关产品推荐

