- 題目:
給定一個三角形,找到從上到下的最小路徑總和。 您可以將每個步驟移動到下面一行中的相鄰數字。 例如,給定以下三角形 [ [2], [3,4], [6,5,7], [4,1,8,3] ]] 從頂部到底部的最小路徑總和為11(即,2 + 3 + 5 + 1 = 11)。 注意: 獎勵點,如果你能夠使用只使用O(n)額外的空間,其中n是三角形中的總行數。
- 思路:
- 第一種解法:這個題目提示是用DP去做。這裡一般的思路是使用二維陣列去儲存每一層與上一層想加的最小值得和。有兩種遍歷方式,從下到上和從上到下。第一種遍歷方式比較簡單。第二種方式需要考慮比較多的因素。
- 程式碼
//從上到下遍歷 class Solution { public: int minimumTotal(vector<vector<int> > &triangle) { int row = triangle.size(); vector<vector<int> > path(row);//申請行空間,二維陣列 for (int i=0; i<row; i++) path[i].resize(triangle[i].size(), 0);//申請列空間 //path[0][0] = triangle[0][0]; int col = 0; for (int i=0; i<row; i++){ col = triangle[i].size(); for (int j=0; j<col; j++){ if (0 == i) path[i][j] = triangle[i][j]; else{ if (j == 0) path[i][j] = path[i-1][j] + triangle[i][j]; else if (j == (col-1)) path[i][j] = path[i-1][j-1] + triangle[i][j]; else //當不是首尾數字的時候,看上一層相鄰的兩個數哪個更小更適合想加 path[i][j] = min(path[i-1][j-1], path[i-1][j]) + triangle[i][j]; } } } int Min = path[row-1][0]; for (int i=0 ;i<path[row-1].size(); i++) if (Min > path[row-1][i]) Min = path[row-1][i]; return Min; } };
//從下到上遍歷 class Solution { public: int minimumTotal(vector<vector<int> > &triangle) { int row = triangle.size(); vector<vector<int> > path(row);//申請行空間,二維陣列 int num = 0; for (int i=row-1; i>=0; i--) path[num++].resize(triangle[i].size(), 0);//申請列空間 int col = 0; int s = row; for (int i=0; i<row; i++){ s--; col = triangle[s].size(); for (int j=0; j<col; j++){ if (0 == i) path[i][j] = triangle[s][j]; else{ //當不是首尾數字的時候,看上一層相鄰的兩個數哪個更小更適合想加 path[i][j] = min(path[i-1][j], path[i-1][j+1]) + triangle[s][j]; } } } return path[row-1][0]; } };
- 第二種解法:在原有空間的基礎上直接進行運算,不用重新名稱空間了。程式碼比較簡潔,但是效率好像不是很高。
(動態規劃)給定三角形,找到從上到下的最小路徑總和
相關文章
- 動態規劃--三角形最小路徑和動態規劃
- [動態規劃] 五、三角形的最小路徑和動態規劃
- 動態規劃6:臺階問題和矩陣最小路徑問題動態規劃矩陣
- java 動態規劃(三角形最短路徑和)Java動態規劃
- 三角形最小路徑和
- 動態規劃之最短路徑和動態規劃
- leadcode的Hot100系列--64. 最小路徑和--權值最小的動態規劃動態規劃
- 演算法題:三角形的最小路徑和演算法
- 動態規劃如何輸出路徑?動態規劃
- 動態規劃 總結動態規劃
- 動態規劃求解矩陣累計和最大的路徑動態規劃矩陣
- leetcode 120 三角形最小路徑和LeetCode
- 動態規劃:最長上升子序列動態規劃
- 最長上升子序列動態規劃動態規劃
- 動態規劃求最長降序序列動態規劃
- 動態規劃-最長公共子序列動態規劃
- 動態規劃——最長公共子序列動態規劃
- 一維動態規劃總結動態規劃
- 【Leetcode】120.三角形最小路徑和LeetCode
- LeetCode-120-三角形最小路徑和LeetCode
- 最小總和問題(動態規劃演算法)動態規劃演算法
- 【動態規劃(一)】動態規劃基礎動態規劃
- 動態規劃-最長上升子序列模型動態規劃模型
- 動態規劃(最長公共子序列LCS)動態規劃
- 動態規劃---求硬幣最優解動態規劃
- 【動態規劃】用一維和二維解決不同路徑動態規劃
- 動態規劃求解數字數字三角形動態規劃
- leetcode總結——動態規劃LeetCode動態規劃
- LeetCode動態規劃總結LeetCode動態規劃
- 動態規劃動態規劃
- [動態規劃] 六、最長迴文子串動態規劃
- 動態規劃7:最長上升子序列LIS動態規劃
- 演算法學習->求解三角形最小路徑演算法
- 動態規劃最大欄位和動態規劃
- 總結 | 動態規劃十問十答動態規劃
- leetcode-動態規劃總結LeetCode動態規劃
- 動態規劃分類題目總結動態規劃
- 演算法之動態規劃總結演算法動態規劃