題目描述:給定乙個數字三角形,找到從頂部到底部的最小路徑和。每一步可以移動到下面一行的相鄰數字上。
本題可以作為動態規劃的題目入門。為了深刻理解,這裡使用3種方法實現:
記憶化搜尋(divide conquer + memorize)
動態規劃(自底向上)
動態規劃(自頂向下)
// 1. 記憶化搜尋(divide conquer + memorize)
class
solution
int rows = ********.
size()
;//行數
int lastrow_cols = ********[rows -1]
.size()
;//最後一行的列數
vector
int>
>
hash
(rows, vector<
int>
(lastrow_cols, int_max));
return
dfs(********,0,
0, hash);}
intdfs
(vector
int>
>
&********,
int x,
int y, vector
int>
>
&hash)
if(int_max != hash[x]
[y])
int left =
dfs(********, x +
1, y, hash)
;int right =
dfs(********, x +
1, y +
1, hash)
; hash[x]
[y]=
min(left, right)
+ ********[x]
[y];
return hash[x]
[y];}}
;// 2. 動態規劃(自底向上)
class
solution
//中間結果計算
for(
int j = n-
2; j >=0;
--j)
}return f[0]
[0];
}};// 3. 動態規劃(自頂向下)
class
solution
if(********[i]
.size()
-1== j)
//正常情況
f[i]
.push_back
(min
(f[i -1]
[j -1]
, f[i -1]
[j])
+ ********[i]
[j]);}
}auto minsum =
min_element
(f[n-1]
.begin()
, f[n-1]
.end()
);return
*minsum;}}
;
Lintcode 109 數學三角形
給定乙個數字三角形,找到從頂部到底部的最小路徑和。每一步可以移動到下面一行的相鄰數字上。注意事項 如果你只用額外空間複雜度o n 的條件下完成可以獲得加分,其中n是數字三角形的總行數。分析 如果從上往下進行計算,會發現越是接近底層的子問題被重複計算的次數越多,為了避免重複的計算,使計算更加簡潔。所以...
lintcode 20 骰子求和 動態規劃
扔 n 個骰子,向上面的數字之和為 s。給定 given n,請列出所有可能的 s 值及其相應的概率。注意事項 you do not care about the accuracy of the result,we will help you to output results.您在真實的面試中是否...
LintCode 91 最小調整代價(動態規劃)
題目 dp i j 表示調整到第i個數時,此時,第i個數取值為j,為代價和最小。顯然dp i 1 k 已知,則調整的總代價為dp i j dp i 1 k abs j a i 由於j和k有多種取值可能,所以迴圈求解判斷,k表示前乙個數,j表示現在的數,假設j確定,那麼k的取值就是在乙個範圍內,因為差...