对于每一行的每个位置
j
j
j,
d
p
i
,
j
dp_{i,j}
dpi,j 表示从该位置到底部的最小路径和
状态转移时,当前位置的最小路径和等于下一行相邻两个位置的最小值加上当前位置的值
最终
d
p
[
0
]
[
0
]
dp[0][0]
dp[0][0] 就是从顶点到底部的最小路径和
状态转移方程:
d
p
[
i
]
[
j
]
=
m
i
n
(
d
p
[
i
+
1
]
[
j
]
,
d
p
[
i
+
1
]
[
j
+
1
]
)
+
t
r
i
a
n
g
l
e
[
i
]
[
j
]
dp[i][j] = min(dp[i+1][j], dp[i+1][j+1]) + triangle[i][j]
dp[i][j]=min(dp[i+1][j],dp[i+1][j+1])+triangle[i][j]
由于每行的状态只和下一行有关,所以可以使用一维数组优化空间。
代码
classSolution{public:intminTrace(vector<vector<int>>& triangle){int n = triangle.size();
vector<int>dp(n +1,0);// 使用一维dp数组优化空间// 从底向上for(int i = n-1; i >=0; i--){for(int j =0; j <= i; j++){
dp[j]=min(dp[j], dp[j+1])+ triangle[i][j];}}return dp[0];}};
importjava.util.*;publicclassSolution{publicintminTrace(int[][] triangle){if(triangle ==null|| triangle.length ==0){return0;}int n = triangle.length;int[] dp =newint[n +1];// 从底向上for(int i = n-1; i >=0; i--){for(int j =0; j <= i; j++){
dp[j]=Math.min(dp[j], dp[j+1])+ triangle[i][j];}}return dp[0];}}
classSolution:defminTrace(self, triangle: List[List[int]])->int:
n =len(triangle)
dp =[0]*(n +1)# 从底向上for i inrange(n-1,-1,-1):for j inrange(i +1):
dp[j]=min(dp[j], dp[j+1])+ triangle[i][j]return dp[0]
算法及复杂度分析
算法:动态规划
时间复杂度:
O
(
n
2
)
\mathcal{O}(n^2)
O(n2),其中
n
n
n 是三角形的行数