演算法 貪心演算法的認識和總結

2021-10-05 16:21:47 字數 2985 閱讀 8581

貪心演算法又稱為貪婪法,是用來尋找最優解問題的常用方法。與動態規劃不同的是,貪心演算法在求解問題時,總是選擇對於當前子問題最好的選擇。也就是貪心演算法的本質是每次只顧眼前利益,並且到最後能獲得最大利益

「貪婪」就像是乙個貪心的人,每次都只能看到眼前(或區域性)的利益最大化,走一步看一步,並且最後能夠得到問題(全域性)利益的最大化。

對於貪心演算法,最重要的就是找到每次的區域性最優解,而動態規劃的關鍵在於找到狀態轉移方程

步驟一:從乙個初始值開始計算

步驟二:採用迭代的過程,如果能夠向目標問題前進一步,就根據區域性最優策略,得到一部分的解

步驟三:將所有的解綜合起來,得到最終的解

3.1 剪繩子

題目描述:給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段(m、n都是整數,n>1並且m>1),每段繩子的長度記為k[0],k[1]...k[m]。請問k[0]*k[1]*...*k[m]可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。

答案需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1。

演算法分析:將問題分為三種情況,一種是長度小於等於3時,長度為2只能剪成成都為1的兩段;當繩子長度為3時,可能把繩子分成1和2的兩段或者都為1的三段。一種是長度等於4時,把繩子剪成兩段長度為2的繩子。最後一種情況是長度大於等於5時,我們盡量將繩子分為長度為3的繩子。

在 n

>=5

n>=5

n>=5

時,可以證明 2(n

−2

)>

n2(n-2)>n

2(n−2)

>

n 並且 3(n

−3

)>

n3(n-3)>n

3(n−3)

>

n。即當繩子長度大於等於5時,我們把它剪成長度為3或者2的繩子段,此時 3(n

−3

)>=2

(n−2

)3(n-3)>=2(n-2)

3(n−3)

>=2

(n−2

),所以我們應盡可能的剪成長度為3的繩子段。

class

solution

return

(int

)(ans * n %

1000000007);

}};

3.2 不同字元的最小序列

題目描述:返回字串 text 中按字典序排列最小的子串行,該子串行包含 text 中所有不同字元一次。

示例 1:

輸入:"cdadabcc"

輸出:"adbc"

基本概念

字典序 — 對於字元而言,按 ascii 碼值進行比較,小的排在前,大的排在後。對於字串,從第 0 位字元開始比較,ascii 碼數值小的排在前面,如果相同,就延後一位比較 ascii 碼值大小。

子串行:子串行不同於子串,子串要求它們在原串中連續,而子串行則不要求連續。子串行是原序列通過刪除若干個字元的到的,例如acd是abcd的子串行,但不是子串。

演算法分析

首先判斷能否使用貪心法

判斷乙個題目能否使用貪心法,最重要的是能否通過區域性最優解得到全域性最優解。題目求解的是字串按字典排序最小的子串行,而且子串行重的字元只能出現一次。

因此我們只要保證所求的子串行從0位開始的每乙個字元都是 ascii 碼值最小的字元,那整個子串行的字典序就是最小的。其中區域性最優就是要子串行每一位的 ascii 碼值是最小的,根據區域性最優解就能得到全劇最優解。

求解區域性最優解,即如何保證子串行從第0位開始 ascii 碼值是最小的。

用示例1作為參考來求解區域性最優解。例如text = "cdadabcc",通過遍歷字母表a~z,從頭到尾依次判斷能否放入子串行中。

首先遍歷到字母a,我們發現字母a第一次出現在 text 中的2號位置。然後判斷字母a之後的字元能否包括題目要求的全部字元,發現後面的字元有dbc包括了字串的全部字元,因此字母a可以作為子串行的第乙個字元。

按照這個思路,我們再填充子串行的下乙個位置。字母a已經在子串行中,遍歷到字母b在 text 中,但是字母b之後的字串不包含字母d,因此字母b不能填充,依次我們發現字母d可以作為子串行的第二個位置填充。

按照這一思路我們依次遍歷完 text 的到最終的結果。

class

solution

//pos表示所選的當前字元在text中的位置

int pos =0;

while

(all)}}

return ret;

}bool

isok

(string& text,

int all,

char ch,

int& pos)

}int p = i+1;

int t =0;

for(

; i < len; i++)}

if(t == all)

return

false;}

};

**實現:

總結 貪心演算法 貪心演算法入門總結

英語 greedy algorithm,又稱貪婪演算法,是一種在每一步選擇中都採取在當前狀態下最好或最優 即最有利 的選擇,從而希望導致結果是最好或最優的演算法。比如在旅行推銷員問題中,如果旅行員每次都選擇最近的城市,那這就是一種貪心演算法。貪心演算法在有最優子結構的問題中尤為有效。最優子結構的意思...

總結 貪心演算法 貪心演算法 跳躍遊戲

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

貪心演算法總結

第一套題主要用貪心演算法來解決問題,貪心演算法簡單來說就是從區域性最優解,進而求得整體最優解,其中難點就是選擇貪心標準,貪心標準的選擇選的巧妙問題就會變的很簡單,比如第一題搬桌子的題,就是把房間轉化為對應的走廊號,問題就簡化了很多。貪心演算法的題目有的可以很簡單的看出來,常見典型的題有,揹包問題,最...