Problem120: Triangle
Last updated
Last updated
这道题是一道经典问题,对于理解 dp 问题非常好。一个直观的想法就是从下往上层层构建,最后到达结果。
f[i][j]
表示从 (i, j) 出发的 path 能取的最小值。
初始化:f[n - 1][j] = triangle[n - 1][j]
,即最底部的点出发到达最低部的最小 path 为本身的值。
状态函数:f[i][j] = triangle[i][j] + min(f[i + 1][j], f[i + 1][j + 1])
,即从 (i, j) 出发的最小 path 为该点的值 triangle[i][j] + 下一行中和该点相邻的点的最小 path。
优化:可以用滚动数组将f[n][n]
优化为f[2][n]
,因为f[i][j]
只和下一行的值有关,因此可以只记录下一行的值和当前行的值,将真实的行数i%2之后即为在滚动数组中的行数。
Update: 优化 space
给定的input类型
通常我们遇到的都是一个二维数组int[][] triangle
, 调用的时候只要triangle[i][j]
就好,但是遇到list的嵌套,我们访问元素的时候,可以 triangle.get(i).get(j)
。同样的内容,不同的方法。
adjacent number dp[i + 1][j], dp[i + 1][j + 1]
就是三角形当中的相邻元素
循环体
注意这两层循环的嵌套。外面一层循环,控制从bottom一层逐渐往上走;里面的一层,控制着每一层的逐行扫描,由左到右。