動態規劃與貪心演算法
貪心演算法:
典型的應用有Huffman樹,直接構造兩個最小的連續相加,得到目標樹。
目標函式f=sum(li*wi);就是權重乘以葉節點的深度求和再求最小值。
如果目標函式修改為f=sum(li+wi)或max(li+wi)或任意函式g(li,wi),是否可以求解呢?
經過幾天研究,發現上面這兩個特殊的函式是可以求解的。
參見引理16.2,16.3。證明兩點。
1 最優方案等價於取兩個最小的合併最優。
2 取兩個最小的合併最優等價於構造新的葉節點最優。
對於求和,上述1 等價於對角之和之差恆為非負值。
上述2 等價於可以構造新節點的權重保持函式形式。完全類似於兩個引理。
動態規劃:
動態規劃是很強大的工具。
典型的有常見的矩陣鏈,最優二叉搜尋樹。
最優二叉搜尋樹其實和上面的貪心演算法有些聯絡。可以認為目標函式是很像的。
ARC問題目標函式也可歸結為Huffman樹的形式,只是有一些順序約束。只能用動態規劃來求解。
參考書目:
Dynamic Programming, A Computational Tool
演算法導論
相關推薦
動態規劃與貪心演算法
貪心演算法: 典型的應用有Huffman樹,直接構造兩個最小的連續相加,得到目標樹。 目標函式f=sum(li*wi);就是權重乘以葉節點的深度求和再求最小值。 如果目標函式修改為f=sum(li+wi)或max(li+wi)或任意函式g(li,wi),是否可以求解呢?
動態規劃與貪心演算法的區別
本來這次是該總結動態規劃的,但在學習過程中發現動態規劃和上一節的貪心演算法有很大聯絡,而在演算法設計過程中主要是對兩種演算法的選擇,所以決定這次以對比的方式做總結,既可以更深入地瞭解動態規劃,又可以對
面試題14:剪繩子(動態規劃,貪心演算法)
一、題目: 一根長度為n的繩子,剪成m段,m,n都大於1,且都為整數,每段長度記為k[0],k[1]…,k[m].求k[0]*k[1]…*k[m]可能的最大乘積 1.1解法: 兩種不同的方法解決這個問題,先用常規的需要O(n²)時間和O(n)空間的動態規劃,接著用只需要O(1)的
動態規劃和貪心演算法之揹包問題理解
一.揹包問題 引用書上關於0-1揹包和部分揹包的闡述: 二.貪心與動態規劃區別 關於紅色矩形部分解釋為什麼0-1不能使用貪心演算法,是因為當你選擇一個物品時,整個物品的大小都需要計算,然而揹包的的大小又是固定的,那麼剩下的揹包大小與剩下的物品之間
動態規劃和貪心演算法的區別
不同點: 貪心演算法: 1.貪心演算法中,作出的每步貪心決策都無法改變,因為貪心策略是由上一步的最優解推導下一步的最優解,而上一部之前的最優解則不作保留。 2.由(1)中的介紹,可以知道貪心法正確的條件是:每一步的最優解一定包含上一步的最優解。
動態規劃or貪心演算法--剪繩子/切割杆
需求一: 剪繩子,將長度為n的繩子剪成若干段,求各段長度乘積的最大值分析: 1、動態規劃 設f(n)代表長度為n的繩子剪成若干段的最大乘積,如果第一刀下去,第一段長度是i,那麼剩下的就需要剪n-i,那麼f(n)=max{f(i)f(n-i)}。而f(n)的最優解對應著f
遞迴、分治策略、動態規劃以及貪心演算法之間的關係
引言 最近集中研究計算智慧,其中涉及到遞迴和動態規劃,動態規劃實現中又用到了遞迴,忽然發現這兩個概念的差別分得不太清楚。索性把遞迴、分治策略、動態規劃、貪婪選擇之間的聯絡與區別都一併搞清楚吧。 1、分治策略(Divide and Conquer)
分治法,動態規劃及貪心演算法區別
轉自:http://hxrs.iteye.com/blog/1055478 分治法,動態規劃法,貪心演算法這三者之間有類似之處,比如都需要將問題劃分為一個個子問題,然後通過解決這些子問題來解決最終問題。但其實這三者之間的區別還是蠻大的。 1.分治法 分治法(di
從最短路徑談動態規劃和貪心演算法
一言以蔽之:動態規劃,從全域性最優考慮;最短路徑,從當前最優考慮。 先考慮下面的圖 可以很容易地看出,如果使用貪心演算法,從a到e的路線將是:a->b->c->d->e,而採用動態的規劃的路線則是:a->c->e。 貪心演算法的優點是程
動態規劃和貪心演算法的比較
動態規劃和貪心演算法都是一種遞推演算法 均有區域性最優解來推導全域性最優解 不同點: 貪心演算法: 1.貪心演算法中,作出的每步貪心決策都無法改變,因為貪心策略是由上一步的最優解推導下一步的最優解,而
再論動態規劃和貪心演算法
個人感覺貪心演算法是一個尋找規律的過程,事實上這種規律有時候是很難找到的,並且還面臨一個重大的問題是我們找的規律(一個極值解)並不一定是最值解,需要推理證明極值等於最值。 而動態規劃是一個尋找子問題的過程,有點類似分制演算法,但是動態規劃重在去掉重複的子問
(轉)動態規劃和貪心演算法的區別
動態規劃和貪心演算法的區別動態規劃和貪心演算法都是一種遞推演算法 均有區域性最優解來推導全域性最優解 不同點: 貪心演算法: 1.貪心演算法中,作出的每步貪心決策都無法改變,因為貪心策略是由上一步的最優解推導下一步的最優解,而上一部之前的最優解則不作保留。 2.由(1)中的介紹,可以知道貪心法正確的條件是:每
劍指offer(面試題14): 動態規劃和貪心演算法求解最優化問題
題目 給定一長為n的繩子,要求把繩子剪成m段(m,n都是整數且n>1,m>1),每段繩子的長度記為k[0], k[1], k[2]…,k[m]。請問k[0]*k[1]*k[2]….*k[m]可能的最大乘積是多少?例如,當繩子的長度是8時,可以剪成2
JavaScript演算法模式——動態規劃和貪心演算法
動態規劃 動態規劃(Dynamic Programming,DP)是一種將複雜問題分解成更小的子問題來解決的優化演算法。下面有一些用動態規劃來解決實際問題的演算法: 最少硬幣找零 給定一組硬幣的面額,以及要找零的錢數,計算出符合找零錢數的最少硬幣數量。例如,美國硬幣面額有1、5、10、25這四種
動態規劃、分治法與貪心演算法的區別
分治法與動態規劃的相同點: 分治法與動態規劃,二者要求原問題具有最有子結構,都是將問題分而治之分解成若干個規模較小的子問題; 不同點:動態規劃是將原問題分解為多個子問題,通過計算出子問題的結果構造一個最優解。動態規劃通過迭代法自底向上求解,動態規劃將分解後的子問題理解為相互
六中常用演算法設計:窮舉法、分治法、動態規劃、貪心法、回溯法和分支限界法
演算法設計之六種常用演算法設計方法 1.直接遍歷態(窮舉法) 程式執行狀態是可以遍歷的,遍歷演算法執行每一個狀態,最終會找到一個最優的可行解;適用於解決極小規模或者複雜度線性增長,而線
HMM學習筆記(三):動態規劃與維特比演算法
學習隱馬爾可夫模型(HMM),主要就是學習三個問題:概率計算問題,學習問題和預測問題。在前面講了概率計算問題:前後向演算法推導,Baum-Welch演算法。最後在這裡講最後的一個問題,預測問題。 預測問題:給定HMM引數
數字三角形問題(簡單動態規劃)-演算法設計與分析
const int maxn=100; int a[maxn][maxn]; int dp[maxn][maxn]; int main() { int n; cin>>n;
動態規劃-與記憶化搜索結合
上下 代碼 記憶 例子 傾斜 輸入 二維 strong 獲得 P1434 滑雪 題目描述Michael喜歡滑雪。這並不奇怪,因為滑雪的確很刺激。可是為了獲得速度,滑的區域必須向下傾斜,而且當你滑到坡底,你不得不再次走上坡或者等待升降機來載你。Michael想知道在一個區域
ALGO-13 攔截導彈(動態規劃(貪心))
gpo namespace cst 雷達 高度 lan 一個 int post 問題描述 某國為了防禦敵國的導彈襲擊,發展出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到