由题意可知:
1. 此题为寻找一条符合给定条件的路径问题
2. 从 “2” 开始寻找,有两条路径可供选择,“2” -> "3" || "2" -> "4",
从 “3” 开始寻找有两条路径可供选择 “3” -> "6" || "3" -> "5" ,
从 “4” 开始寻找有两条路径可供选择 "4" ->"5" || "4" -> "7"
......
3. 所以可能选择的路径为:
可以得出,可以通过遍历所有可能的路径来得到最后的答案
...
第2种方法:
就是从节点的选择上来看, 第一层节点 "2" 被选择的概率是100%, 第二层节点"3" 和 "4"被选择的概率各为50%, 所以若每一层每一个节点都有被选择的可能,我们可以自顶向下求出每一个节点被选择时的最短路径长度,举例说明:
第二层: 若选择节点3, 那么最短路径为 2 -> 3, 路径长度为5, 若选择节点4, 那么最短路径为2 -> 4,路径长度为6.
第三层: 若选择节点6, 那么最短路径就是 3 -> 6, 路径长度为11; 若选择节点5, 那么最短路径就是3 -> 5, 路径长度为10, 若选择节点7, 那么最短路径就为4 -> 7, 长度为13.
第四层:若选择节点4, 那么最短路径就为 6 -> 4, 长度为15; 若选择节点1, 那么最短路径就为 5 -> 1, 长度为11; 若选择节点8, 那么最短路径就为 5 -> 8, 长度为18; 若选择节点3, 最短路径就为7 -> 3, 长度为16.
所以可以得到最终答案为11
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int n = triangle.size();
int m = triangle[n - 1].size();
vector<vector<int>> dp(n, vector<int>(m));
dp[0][0] = triangle[0][0];
for (int i = 1; i < m; ++i) {
dp[i][0] = dp[i - 1][0] + triangle[i][0];
for (int j = 1; j < triangle[i].size() - 1; ++j) {
dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j]) + triangle[i][j];
}
dp[i][triangle[i].size() - 1] =
dp[i - 1][triangle[i - 1].size() - 1] +
triangle[i][triangle[i].size() - 1];
}
return *min_element(dp[n - 1].begin(), dp[n - 1].end());
}
};