Python构建DP矩阵时出现list index out of range报错是什么原因?
报错根因
你的二维列表初始化逻辑把行、列维度搞反了,导致实际生成的矩阵维度和预期不一致,访问索引越界。
- 按照你定义的
rows = N+1 = 4,cols = sum1+1 =5,要生成rows行、cols列的矩阵,Python二维列表初始化的规则是外层循环控制行数,内层循环控制列数,正确写法应该是dp = [[-1 for i in range(cols)] for j in range(rows)] - 你当前的写法
dp = [[-1 for i in range(rows)] for j in range(cols)]生成的是cols行、rows列的矩阵,也就是5行、4列,每行只有4个元素,索引范围是0~3 - 第一个循环
for i in range(0, cols)的i会遍历0~4,当i=4时访问dp[0][4],超出了dp[0]的最大索引3,直接触发越界错误
修改为dp[0][i-1]不报错的原因
i从0到4时,i-1的范围是-1~3,虽然i=0时会访问dp[0][-1](也就是该行最后一个元素)不会触发语法报错,但这个逻辑完全不符合你的功能预期,只是碰巧避开了语法错误而已。
符合需求的修正代码
你的预期是创建3*4的dp矩阵,第一列全为True、第0行除(0,0)外全为False,修正后代码如下:
# 定义3行4列的矩阵维度 rows, cols = (3, 4) # 按行优先顺序初始化矩阵 dp = [[-1 for _ in range(cols)] for _ in range(rows)] # 处理第0行:仅(0,0)为True,其余为False dp[0][0] = True for i in range(1, cols): dp[0][i] = False # 处理第0列:全部为True for i in range(0, rows): dp[i][0] = True
如果需要保留原代码的N、sum1变量,仅调整二维列表初始化时的行列顺序即可。
内容的提问来源于stack exchange,提问作者Rah Maha
相关产品推荐
相关产品推荐

