貪心與動態規劃的區別

2021-06-29 06:48:58 字數 2389 閱讀 9786

貪心與動規的區別

關鍵:

看是否用到之前的最優解,如果用到就是動態規劃,否則就是貪心,貪心無法解決動態規劃的問題,但是動態規劃能解決貪心的問題

很多同學在做動規題的時候,很容易做成貪心,的確,動規和貪心是很相近的,在很多時候,動規和貪心沒有明顯的界限,反而在很多時候,我們需要使用貪心的思想,對動規進行優化,不過這也就導致了很多同學分不清什麼題是動規,什麼題是貪心。 

現在我們來回憶一下,動規的思想是什麼,以前乙個或者多個狀態的最優值,加上現在這個狀態的最優解,在其中取得當前的最優解,再層層遞推,得到最終答案。 

那麼貪心呢??  

貪心的思想是由區域性的最優解進行組合,使用分治的思想,區域性的最優解組合起來就得到了總得最優解。 

仔細對比兩種思想,你發現兩者之間有什麼差別了嗎??  

沒錯,在貪心中,每乙個區域性的最優解之間是沒有任何聯絡的,我們可以分開同時求解,而在動態規劃中,我們必須要應用前面的階段中的最優值,才可以得到當前的最優值。 

所以在區別動歸和貪心的時候,關鍵就是:  

我們在得到當前最優解的時候,需不需要使用前面的階段中的得到的值,如果不需要,那就是貪心;如果需要,就是動歸。

下面我舉一道題來說明,這是非常基礎的一道題,每乙個人都見過,數字三角形。 

現在有乙個數字三角形,我們從最上方走到最下方。比如下面這個數字三角形 

7 3  8 8  1  0 2  7  4  4 4  5  2  6  5 

如果我不給出乙個點只能走到左下或者右下這個限制條件,我們可以從這一層的乙個點走到下一層的任意乙個點,那麼我們發現這道題就是乙個很簡單的貪心, 

取出每一排的最大的數字相加就是我們的和。 如果加上了那個條件呢??? 

那麼我們就必須使用動態規劃,方程很簡單f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j]; 

為什麼加上乙個條件後,就變成了動態規劃呢??  

因為我們加上了這個條件之後,我們走到當前這乙個層的時候,

受到了前面走到的節點的限制,我們必須要依賴於前面走到的節點,才能夠走到當前的節點,所以這道題就不是貪心,而是動歸。 

貪心可以保證一次最優,而動規可以保證整體最優,  

大家清楚了嗎?  

最後我們來回憶一下當初同學們都以為是貪心的一道題,田忌賽馬: 

田忌賽馬

【問題描述】 

中國古代的歷史故事「田忌賽馬」是為大家所熟知的。話說齊王和田忌又要賽馬了,他們各派出n匹馬,每場比賽,輸的一方將要給贏的一方200兩**,如果是平局的話,雙方都不必拿出錢。現在每匹馬的速度值是固定而且已知的,而齊王出馬也不管田忌的出馬順序。請問田忌該如何安排自己的馬去對抗齊王的馬,才能贏取最多的錢? 

【輸入格式】 

第一行為乙個正整數n (n <= 2000) ,表示雙方馬的數量。 第二行有n個整數表示田忌的馬的速度。 第三行的n個整數為齊王的馬的速度。  【輸出格式】 

僅有一行,為田忌賽馬可能贏得的最多的錢,結果有可能為負。 

【輸入樣例】  3 

92 83 71 

95 87 74 

【輸出樣例】 

200 

當初同學們在思考這道題的時候大都認為這是一道貪心,自己的馬如果能勝,就用最大的一匹取勝,如果不能,就用最差的那匹取輸,這種思想看似有理,但是有乙個很簡單的道理,存在平局。 

所以贏得多,可能輸得越多,贏得少,可能輸得少。 

所以,簡單的相加不能夠得到我們的最優解,我們發現這種策略存在明顯的動態規劃特徵。 

由於齊王的馬的出場順序是確定的,所以前面的馬的安排不會影響到後面的對決,前面得到的最優解加上現在對決的最優解就是當前的最優解,最優子問題,無後效性,都存在,所以這一定是一道動規。 

線性?區間?揹包?  

很明顯,這是一道區間的問題,i到j這乙個區間的最優值是不是其中的一匹馬去對戰齊王的第j-i匹馬的結果加上剩下的馬去對戰齊王的j-i-1匹馬的最大值的最大值。 

那麼貪心就完全沒用了嗎???  

我說過貪心可以優化動規,因為動規本來就滿足最優子問題結構,使用貪心的思想,在求最優子問題的時候,可以省下不少的時間. 

在這道題中,當我們在i到j這個區間內選派馬去和齊王的j-i這匹馬對戰的時候,我們使用前面得到的貪心策略, 1. 用最大的馬 2. 用最小的馬 

我說過,貪心在一次的決策中可以保證是最優的 

所以無論如何,這樣的策略在這一次決策中一定是最優的,這樣我們就使用貪心策略清楚地解決了動規的最優子問題。 

f[i][j]代表田忌的第i到第j匹馬對戰齊王的前j-i匹馬得到的最大值. 

f[i][j]=max;

最後再次重申一句話: 

貪心是區域性的最優解,動規是整體的最優解

貪心與動態規劃的區別與聯絡

先來看乙個例子 如圖,各結 點代表城市,兩結點間連 線上數字表 示城市間的 距離。試找出從結點a到 結點e的最短距離 貪心 首先,這題如果用貪心來看的話,則為a b2,b2 c4,c4 d2,d2 e,這應該沒有爭議吧 如果硬要挑毛病的話那麼就假設是有向圖,只能往右走 這樣得出來的結果是31,這是貪...

動態規劃與貪心演算法的區別

本來這次是該總結動態規劃的,但在學習過程中發現動態規劃和上一節的貪心演算法有很大聯絡,而在演算法設計過程中主要是對兩種演算法的選擇,所以決定這次以對比的方式做總結,既可以更深入地了解動態規劃,又可以對貪心演算法有個新的認識。背景介紹 這兩種演算法都是選擇性演算法,就是從乙個候選集合中選擇適當的元素加...

動態規劃,貪心,分治演算法的區別

以下摘自 演算法筆記 在區別它們之前我們先明確兩個概念 1.什麼是重疊子問題?如果乙個問題可以被分解為若干子問題,並且這些子問題會重複出現,那麼就稱這個問題為重疊子問題。2.什麼是最優子結構?如果乙個問題的最優解可以由其他子問題的最優解有效的構造出來,那麼這個問題擁有最優子問題。動態規劃與分治的區別...