資料結構與演算法之動態規劃淺講

2021-10-03 20:27:15 字數 672 閱讀 4612

make it work, make it right, make it fast!

即從遞迴(效率往往不能讓人滿意)到 迭代!

斐波那契數列:

最low遞迴解法:

第43項 需要1秒

第67項 需要1天

第92項 需要3生三世

所以嚴格意義上來講,這根本不算是乙個演算法!

int

fib(n)

很明顯這和上到第n個台階(每次上1個或2個)有多少種方法是一樣的。

實現方法中有有大量重複計算和遞迴。因此我們怎麼解決呢?

最容易想到的方法就是把之前算過的數存下來,然後當需要用的時候取出來。

迭代: 以下方法越來越好,嘿嘿

記憶(memoization)

將已計算過例項的結果製表備查。

動態規劃(dynamic programing)

顛倒計算方向:由自頂向下遞迴,改為自底而上的迭代。

//t(n) = o(n)  只需要o(1)的空間

f =0

; g =1;

//fib(0), fib(1)

while(0

< n--

)return g;

演算法與資料結構 動態規劃

動態規劃 dp 的基本思想是 當前子問題的解可由上一子問題的解得出。動態規劃演算法通常基於由乙個遞推公式 狀態轉移方程 和若干個初始狀態 狀態 應用 1 lis longest increasing subsequence 求乙個陣列中的最長非降子串行的長度。子問題 我們可以考慮先求a 0 a 1 ...

演算法與資料結構 動態規劃

用遞迴求解問題時,反覆的巢狀會浪費記憶體。而且更重要的一點是,之前計算的結果無法有效儲存,下一次碰到同乙個問題時還需要再計算一次。例如遞迴求解 fibonacci 數列,假設求第 n 位 從 1 開始 的值,c 如下 include intfib int n return fib n 1 fib n...

資料結構與演算法練習 動態規劃

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...