dynamicProgramming2

题目描述[原题链接][https://leetcode-cn.com/problems/triangle/]

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

例如,给定三角形:

1
2
3
4
5
6
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]

自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

说明:

如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。

算法描述

从底向上,从倒数第二行更新数据,通过dp[i][j]+=min(dp[i+1][j],dp[i+1][j+1]),更新数据,最后最小值的和会保存在dp[0][0]

C++代码

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public:
int minimumTotal(vector<vector<int>>& t) {
for(int i = t.size()-2;i>=0;i--){
for(int j=0;j<t[i].size();j++){
t[i][j]+=min(t[i+1][j],t[i+1][j+1]);
}
}
return t[0][0];
}
};

Java代码

1
2
3
4
5
6
7
8
9
10
class Solution {
public int minimumTotal(List<List<Integer>> t) {
for(int i=t.size()-2;i>=0;i--){
for(int j=i;j>=0;j--){
t.get(i).set(j,Math.min(t.get(i+1).get(j),t.get(i+1).get(j+1))+t.get(i).get(j));
}
}
return t.get(0).get(0);
}
}