動態規划和貪心算法都是一種遞推算法 即均由局部最優解來推導全局最優解 (不從整體最優解出發來考慮,總是做出在當前看來最好的選擇。)
不同點:
貪心算法
與動態規划的區別:貪心算法中,作出的每步貪心決策都無法改變,由上一步的最優解推導下一步的最優解,所以上一部之前的最優解則不作保留。
能使用貪心法求解的條件:是否能找出一個貪心標准。我們看一個找幣的例子,如果一個貨幣系統有三種幣值,面值分別為一角、五分和一分,求最小找幣數時,可以用貪心法求解;如果將這三種幣值改為一角一分、五分和一分,就不能使用貪心法求解。
例:貪心法標准的選擇
設有n個正整數,將它們連接成一排,組成一個最大的多位整數。
例如:n=3時,3個整數13,312,343,連成的最大整數為34331213。
又如:n=4時,4個整數7,13,4,246,連成的最大整數為7424613。
輸入:n個數
輸出:連成的多位數
算法分析:此題很容易想到使用貪心法,在考試時有很多同學把整數按從大到小的順序連接起來,測試題目的例子也都符合,但最后測試的結果卻不全對。按這種標 准,我們很容易找到反例:12,121應該組成12121而非12112,那么是不是相互包含的時候就從小到大呢?也不一定,如12,123就是 12312而非12123,這種情況就有很多種了。是不是此題不能用貪心法呢?其實此題可以用貪心法來求解,只是剛才的標准不對,正確的標准是:先把整數轉換成字符串,然后在比較a+b和b+a,如果a+b>=b+a,就把a排在b的前面,反之則把a排在b的后面。
動態規划算法
與貪心法的區別:不是由上一步的最優解直接推導下一步的最優解,所以需要記錄上一步的所有解 (下例中的F[i][j]就表示第i行的j個解)
能使用動態規划算法的條件:
如果一個問題被划分各個階段之后,階段I中的狀態只能由階段I-1中的狀態通過狀態轉移方程得來,與其它狀態沒有關系,特別是與未發生的狀態沒有關系,那么這個問題就是“無后效性”的,可以用動態規划算法求解
動態規划算法求解:
1。定義階段:第i行第j列的值a[i][j]
2。定義狀態:走到第i行第j列的最大值F[i][j]
3。狀態轉移方程:F[i][j] = a[i][j]+max(F[i+1][j], F[i+1][j+1])
4。定義邊界條件:當i = n時,F[i][j] = a[i][j]; 即一開始可以直接得出的局部最優解