動態規劃和貪心

2021-07-11 15:09:10 字數 1045 閱讀 6945

貪心演算法是種策略,思想。。。

它並沒有固定的模式

比如最簡單的揹包問題

用貪心的思想去做,就可能有很多種方法

價效比最高的、價值最高的、重量最輕的

而你沒辦法確保你所選擇的貪心策略對所有的情況都是絕對最優的

動態規劃的思想是分治+解決沉餘

把乙個複雜的問題分解成一塊一塊的小問題

每乙個小問題中得到最優解

再從這些最優解中獲取更優的答案

典型的例子數塔問題

畫個圖就能看出來

**
求最優解的問題,從根本上說是一種對解空間的遍歷。最直接的暴力分析容易得到,最優解的解空間通常都是以指數階增長,因此暴力窮舉都是不可行的。

最優解問題大部分都可以拆分成乙個個的子問題,把解空間的遍歷視作對子問題樹的遍歷,則以某種形式對樹整個的遍歷一遍就可以求出最優解,如上面的分析,這是不可行的。

貪心和動態規劃本質上是對子問題樹的一種修剪。兩種演算法要求問題都具有的乙個性質就是「子問題最優性」。即,組成最優解的每乙個子問題的解,對於這個子問題本身肯定也是最優的。如果以自頂向下的方向看問題樹(原問題作根),則,我們每次只需要向下遍歷代表最優解的子樹就可以保證會得到整體的最優解。形象一點說,可以簡單的用乙個值(最優值)代表整個子樹,而不用去求出這個子樹所可能代表的所有值。

動態規劃方法代表了這一類問題的一般解法。我們自底向上(從葉子向根)構造子問題的解,對每乙個子樹的根,求出下面每乙個葉子的值,並且以其中的最優值作為自身的值,其它的值捨棄。動態規劃的代價就取決於可選擇的數目(樹的叉數)和子問題的的數目(樹的節點數,或者是樹的高度?)。

貪心演算法是動態規劃方法的乙個特例。貪心特在,可以證明,每乙個子樹的根的值不取決於下面葉子的值,而只取決於當前問題的狀況。換句話說,不需要知道乙個節點所有子樹的情況,就可以求出這個節點的值。通常這個值都是對於當前的問題情況下,顯而易見的「最優」情況。因此用「貪心」來描述這個演算法的本質。由於貪心演算法的這個特性,它對解空間樹的遍歷不需要自底向上,而只需要自根開始,選擇最優的路,一直走到底就可以了。這樣,與動態規劃相比,它的代價只取決於子問題的數目,而選擇數目總為1。

動態規劃 貪心

區別 動態規劃 全域性最優解中一定包含某個區域性最優解,但不一定包含前乙個區域性最優解,因此需要記錄之前的所有最優解。條件 最優子結構 重疊子問題。方法 自底向上構造子問題的解。例子 子串行最大和問題,滑雪問題 貪心演算法 條件 每一步的最優解一定依賴上一步的最優解。方法 從問題的某乙個初始解出發逐...

動態規劃和貪心演算法

動態規劃 通過組合子問題的解來求解原問題,常用來求解最優化問題。常用來解決以下幾類問題,但不是說遇到類似問題必須用動態規劃來解決,可以往這方面去想 1.計數問題,如有多少種方式走到右下角,有多少種方法選出k個數使得和是sum 2.求最大最小值,如從左上角走到右下角路徑的最大數字和 3.求存在性,如取...

跳躍遊戲(貪心和動態規劃)

給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後乙個位置。示例 1 輸入 2,3,1,1,4 輸出 true 解釋 我們可以先跳 1 步,從位置 0 到達 位置 1,然後再從位置 1 跳 3 步到達最後乙個位置。示例 2 輸入...