120.三角形最小路径和
120.三角形最小路径和
题解
典型的动态规划问题,题解看注释即可
代码
package main func minimumTotal1(triangle [][]int) int { //自顶向下 dp := make([][]int, len(triangle)) for i := 0; i < len(triangle); i++ { dp[i] = make([]int, len(triangle[i])) copy(dp[i], triangle[i]) } for i := 1; i < len(triangle); i++ { for j := 0; j < len(triangle[i]); j++ { if j == 0 { //这一层的第一个数字,只会是上一层的第一个数字 dp[i][j] = dp[i-1][j] + triangle[i][j] } else if j > len(triangle[i-1])-1 { //这一层的最后一个数字,只会是上一层的最后一个数字 dp[i][j] = dp[i-1][j-1] + triangle[i][j] } else { //中间的数字有2种走法 dp[i][j] = min(dp[i-1][j], dp[i-1][j-1]) + triangle[i][j] } } } result := dp[len(triangle)-2][0] for i := 1; i < len(dp[len(triangle)-2]); i++ { result = min(result, dp[len(triangle)-2][i]) } return result } func minimumTotal2(triangle [][]int) int { //自下而上 dp := make([][]int, len(triangle)) for i := 0; i < len(triangle); i++ { dp[i] = make([]int, len(triangle[i])) copy(dp[i], triangle[i]) } for i := len(triangle) - 2; i >= 0; i-- { for j := 0; j < len(triangle[i]); j++ { dp[i][j] = min(dp[i+1][j], dp[i+1][j+1]) + triangle[i][j] } } return dp[0][0] } func min(a, b int) int { if a > b { return b } return a }