動態規劃之深入淺出

2021-09-10 09:24:39 字數 1187 閱讀 3419

動態規劃(dynamic programming,dp)演算法目的為解決多階段決策最優化問題,採取的方法是將待求解的問題分解為多個子問題,按順序求解每乙個子問題,當前子問題的解將由前乙個子問題的解推導出,最後乙個子問題就是初始問題的解。

由於動態規劃解決的問題多數有重疊子問題這個特點,為減少重複計算,對每乙個子問題只解一次,將其不同階段的不同狀態儲存在乙個二維陣列中,以便下一次求解同一子問題時直接查表。

動態規劃求解最優化問題僅需多項式時間複雜度,比回溯法、暴力法等效率更高,當問題具有多個可行解,且要求尋找多個可行解中的最大值或者最小值時,往往可採取動態規劃求解。

動態規劃的設計步驟如下:

尋找最優子結構:按照問題的時間或空間特徵,把問題分為若干個階段。劃分後的階段一定要有序或者可排序,否則無法求解;

設計遞迴公式,遞迴地定義最優值的值;

以自底向上或自頂向下的記憶化方式(備忘錄法)計算出最優值;

根據計算得到的資訊,構造乙個最優解。

題目:給定乙個三角形佇列,從最頂端往下走,尋找和最小的路徑。

分析:由於從頂端往下走有多條路徑,問題具有多個可行解,並且每一條路徑的和不一樣,而題目要求和最小,顯然該問題屬於動態規劃問題。

下面,按照動態規劃的設計步驟解決該問題:

1. 尋找最優子結構

除了最底層外,每一層的每個節點均有兩個選擇,從「2」出發,可選擇「3」或者「4」,因此從「2」出發的最優路徑,為從「3」出發或者從「4」出發的最優路徑中最小的一條。而從「3」出發的最優路徑,為從「6」出發或者從「5」出發的最優路徑中最小的一條。

2. 設計遞迴公式

根據上述分析,用

其中,3. 計算最優值

我們分別以自底向上或自頂向下兩種方法求解該問題:

int minimumtotal(vector> &********)
自頂向下:該方法是遞迴形式的,且攜帶備忘錄,不會計算重複子問題。

int minimumtotal(vector> &********)

深入淺出之STL

c stl 標準模板庫 是一套功能強大的 c 模板類,提供了通用的模板類和函式,這些模板類和函式可以實現多種流行和常用的演算法和資料結構,如向量 鍊錶 佇列 棧。c 標準模板庫的核心包括以下三個元件 元件描述 容器 containers 容器是用來管理某一類物件的集合。c 提供了各種不同型別的容器,...

深入淺出sizeof

int佔 位元組,short佔 位元組 1.0 回答下列問題 答案在文章末尾 1.sizeof char 2.sizeof a 3.sizeof a 4.strlen a 如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起 關於sizeof...

深入淺出ShellExecute

ipconfig c log.txt應如何處理?二樓的朋友,開啟拔號網路這樣 shellexecute null,open c windows rundll32.exe shell32.dll,control rundll c windows system telephon.cpl null,sw ...