1. 程式人生 > >演算法——最優解之動態規劃

演算法——最優解之動態規劃

1. 動態規劃的定義

動態規劃作為一個非常優秀的演算法被很多應用稱為Optimal Algorithm
,也就是所謂的最優演算法。它是一個總能找到最優解的演算法,而它主要應用於多階段決策的問題。但是,它也存在著一定的弊端,也就是準確度和效率不能並存,它一定能找到最優解,但是其時間複雜度通常都是冪指數,有很多應用只能在中小規模中實現,但這絲毫不影響動態規劃的名聲。下面我們給出動態規劃的描述性語言:

無論過程的初始狀態和初始決策是什麼,其餘的決策都必須相對於初始決策所產生的狀態構成一個最有序列。

動態規劃的核心主要是:狀態轉移。這個說法可能比較抽象,我們會在接下來的一個一個例子中,找到答案。

2. 多段圖問題

1. 問題描述

多段圖問題作為動態規劃的入門問題,相對來講是比較好理解的,其問題描述如下:

有一點S要到終點T,中間要經過若干段,每一段都有若各種走法,求出花費最少的路徑。

這樣的描述可能太過抽象,我們可以看下圖
這裡寫圖片描述
我們要從出發點1走到目標點12,中間需要走的段數有3段,分別有4個結點、3個結點、3個結點,那麼我們怎麼才能從這10個節點中,每個段中選擇一個,最後拼出來最短路徑呢?

2. 演算法詳解

這有點讓我們想到了一個經典的問題,就是坐火車問題。我們這裡使用向前處理法。也就是從12往前推,一段一段的靠到起點上。思路如下:
9,10,11這3個結點沒有說的,只有一條路可以到達12,所以不用動。再往前看1段,在6,7,8這一段中,有3個結點,那麼這三個結點怎麼選擇9,10,11節點後到達12結點最近呢,只需要通過計算後,就能知道每個結點的最短路徑了,然後依次類推,直到到達出發路徑。
思想就是這樣,那麼其核心公式就是
%C

OST(i,j)=minc(j,l)+COST(i+1,l)$

具體程式碼在Github上展示,這裡我們只寫出演算法:

procedure FGRAPH(E,k,n,p)
//輸入的按段的順序給結點編號的,有n個結點的k段圖。E是邊集,ci,j)是邊<i,j>的成本。P(1:k)是最小成本路徑。
    real COST(n)integer D(n-1),P(k)r,j,k,n
    COST(n)←0
    for jn-1 to 1 by -1 dor 是一個這樣的結點,(j,r)E且使c(j,r)+COSTr)取最小值
        COST
j)←c(j,r)+COST(r) Dj)←r repeat P(1)←1;
P(k)←n for j←2 to k-1 do P(j)←D(P(j-1)) repeat end FGRAPH

這就是多段圖的向前處理法。

3.最優二分檢索

1.問題描述

我們之前講過二分檢索時,說二分檢索已經是基於比較檢索的時間下限了,那麼最優二分檢索是什麼東西呢,我們之前講二分檢索時,每一個部分都是具有相同的先驗概率的,但是如果我們的先驗概率如果不一致時,如何進行檢索呢,比如,我們常見到的猜物品價格的遊戲,事實上,它的價格分佈並不是均勻的,一個微波爐,顯然大於1000的可能性比較小,因此正常的二分檢做並不能達到最優, 這時候就需要最優二分檢索樹來幫忙了。
我們最優二分檢索樹的目標是:要使得檢索的成本儘可能的小,無論查詢到了還是沒找到。

2. 演算法詳解

我們這裡給出核心思想:
已知a(1:n),P(1:n),Q(0:n)
初始條件:w(i,i)=Q(i),C(i,i)=0,R(i,i)=0
公式:
C(i,j)=min{C(i,k-1)+C(k,j)}+W(i,j) (i

4. 0/1揹包問題

1.問題描述

這裡我們加了一個限制條件叫做0/1揹包問題,和之前的揹包問題不同的是,這個揹包問題只能要麼全部裝進去,要麼都不裝進去,這樣子,我們用之前的貪心演算法並不能解決了,這時候,就要使用我們的動態規劃的思想了,我們這裡就介紹這個演算法,它和我們前面兩個問題不同,它採用的是狀態轉移的思想來解決。

2.演算法詳解

如果我們設fj(x)KNAPi,j,x最優解的值
fn(m)=Max(fn1(M),fn1(MWn)+Pn)
這樣,由遞推關係就找到了,但是我們不用這方法,我們使用一種狀態轉移的方法。
由關係式可得fi1(MWi)+Pifi1(X)WiPi
定義序偶為(pi,wi),(p0,w0)=(0,0)
Si1fi1Sifi1(MWi)+Pi(wi,pi)Si1Si11
但是這集合是有支配規則的:
1)wiwmax
2)wjwkp

相關推薦

演算法——動態規劃

1. 動態規劃的定義 動態規劃作為一個非常優秀的演算法被很多應用稱為Optimal Algorithm ,也就是所謂的最優演算法。它是一個總能找到最優解的演算法,而它主要應用於多階段決策的問題。但是,它也存在著一定的弊端,也就是準確度和效率不能並存,

證明求短路徑問題具有子結構(動態規劃

演算法導論218頁說了很多來說明最長路徑問題不能用動態規劃演算法,最短路徑可以。在證明最短路徑子問題無關時候應該是預設承認了最短路徑的最優子結構的。可是證明最優子結構需要用到複製貼上法,在用複製貼上法的時候又不免會因為子問題不是無關的從而不能複製貼上,所以不能證明最優子結構,

獨立任務排程(動態規劃

題目: 用兩臺處理機A和B處理n個作業。設A和B處理第k個作業的時間分別為ak和bk。由於各個作業的特點和機器效能的關係,對某些作業,在A上的處理時間長;而對另一些作業,在B上的處理時間更長。一臺

三角劃分(動態規劃) By ACReaper

1.有狀態轉移方程為f(i,j) = max(f(i,k) + f(k,j) + w(i,j,k));f(i,j)表示從vi到vj的簡單通路(我們預設vj指向vi),這樣才能構成凸多邊形,同時表示在這個凸多邊形中權和的最大值。    2.由3邊的凸多邊形也就是三角形開始遞推

動態規劃演算法-----找零錢問題(求

動態規劃演算法通常用於求解具有某種最優性質的問題。動態規劃演算法與分治法類似,其基本思想都是將待求解問題分解成若干個子問題,先求解子問題,然後從這些子問題的解得到原問題的解。與分治法不同的是,適合於用動態規劃求解的問題,經分解得到的子問題往往不是互相獨立的。如果

由Leetcode詳演算法 動態規劃(DP)

因為最近一段時間接觸了一些Leetcode上的題目,發現許多題目的解題思路相似,從中其實可以瞭解某類演算法的一些應用場景。 這個隨筆系列就是我嘗試的分析總結,希望也能給大家一些啟發。 動態規劃的基本概念 一言以蔽之,動態規劃就是將大問題分成小問題,以迭代的方式求解。 可以使用動態規劃求解的問題

演算法導論》動態規劃重構

動態規劃(dynamic programming)就是把問題分解成一個個的子問題,然後對子問題進行求解。下面用通俗易懂的語言來解釋下動態規劃中關於重構解的理解。既儲存最優切割收益也儲存切割方案! 重構解 1、儲存最優切割收益也儲存切割方案的演算法 用 s[ j

演算法學習動態規劃--數字三角形大路徑和

題目: 7 3  8 8  1  0 2  7  4  4 4  5  2  6  5 在上面的數字三角形中尋找一條從頂部到底邊的路徑,使得路徑上所經過的數字之和最大。路徑上的每一步都只能往左下或右下走。只需要求出這個最大和即可,不必給出具體路徑。三角形的行數大於1小於

動態規劃——求數字三角形路徑

給定一個由n行數字組成的數字三角形如下圖所示。試設計一個演算法,對於給定的由 n行數字組成的數字三角形, 計算從三角形的頂至底的路徑經過的數字和的最大值。 注意:對於第i層的第j個數字,其所在路徑的下一個數字只能是第i+1層的第j個或第j+1個數字。

演算法動態規劃(一)】動態規劃(DP)詳

一、基本概念 動態規劃(dynamic programming)是運籌學的一個分支,是求解決策過程(decision process)最優化的數學方法。20世紀50年代初美國數學家R.E.Bellman等人在研究多階段決策過程(multistep d

演算法學習動態規劃--長公共子序列

題目: 給出兩個字串,求出這樣的一個最長的公共子序列的長度:子序列中的每個字元都能在兩個原串中找到,而且每個字元的先後順序和原串中的先後順序一致。 Sample Input : abcfbc abfc

利用動態規劃的思想求

源自《劍指offer》中的剪繩子問題,書中使用的是C++,但是我更喜歡用python實現。這裡按照從上而下的順序計算,也就是說我們先得到f(2)、f(3),再得到f(4)、f(5),直到得到f(n)... # -*- coding:utf-8 -*- #利用動態規劃的思

演算法分析與設計:動態規劃矩陣鏈乘

矩陣鏈乘問題 對於給定的n個矩陣,M1, M2 ,…, Mn,其中矩陣Mi 和Mj 是可乘的,要求確定計算矩陣連乘積 ( M1M2 …Mn )的計算次序,使得按照該次數計算 矩陣連乘積時需要的乘法次數最少 1、描述最優解結構 目標: 求出矩陣鏈乘Mi Mi+1 ┅Mj-1 Mj(

用貪心演算法

題目:有 m 元錢,n 種物品;每種物品有 j 磅,總價值 f 元,可以 使用 0 到 f 的任意價格購買相應磅的物品,例如使用 0.3f 元,可以購買 0.3j 磅物 品。要求輸出用 m 元錢最多能買到多少磅物品 演算法思想:,每次都買價效比最高的產品,價效比的計算公式為(重量\價格),價效比

演算法動態規劃

含義     動態規劃(dynamic programming)是運籌學的一個分支,是求解決策過程(decision process)最優化的數學方法。 分類     動態規劃一般可分為線性動規,

C++ Leetcode初級演算法動態規劃

1.爬樓梯 假設你正在爬樓梯。需要 n 階你才能到達樓頂。 每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢? 注意:給定 n 是一個正整數。 示例 1: 輸入: 2 輸出: 2 解釋: 有兩種方法可以爬到樓頂。 1.1 階 + 1 階 2.2 階 示

Leetcode題解動態規劃(4)大子序和打家劫舍

題目:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/23/dynamic-programming/57/ 題目描述: 打家劫舍 你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有

Leetcode題解動態規劃(3)大子序和

題目:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/23/dynamic-programming/56/ 題目描述:   最大子序和 給定一個整數陣列 

程式設計師程式碼面試指南:IT名企演算法與資料結構題目

網站 更多書籍點選進入>> CiCi島 下載 電子版僅供預覽及學習交流使用,下載後請24小時內刪除,支援正版,喜歡的請購買正版書籍 電子書下載(皮皮雲盤-點選“普通下載”) 購買正版 封頁 編輯推薦 如何在IT名企的面試中脫穎

藍橋杯 演算法訓練 ALGO-116 大的算式 動態規劃 資源分配型別(大乘積)

演算法訓練 最大的算式 時間限制:1.0s 記憶體限制:256.0MB 問題描述   題目很簡單,給出N個數字,不改變它們的相對位置,在中間加入K個乘號和N-K-1個加號,(括號隨便加)使最終結果儘量大。因為乘號和加號一共就是N-1個了,所以恰好每兩個相鄰數字之間都有一個符號。例如: