乾貨 動態規劃九問九答

2021-10-05 12:00:32 字數 1976 閱讀 3336

:動態規劃是一種通過「大而化小」的思路解決問題的演算法。區別於一些固定形式的演算法,如二分法,寬度優先搜尋法,動態規劃沒有實際的步驟來規定第一步做什麼第二步做什麼。所以更加確切的說,動態規劃是一種解決問題的思想。這種思想的本質是,乙個規模比較大的問題(假如用2-3個引數可以表示),是通過規模比較小的若干問題的結果來得到的(通過取最大,取最小,或者加起來之類的運算)所以我們經常看到的動態規劃的核心——狀態轉移方程都長成這樣:

:多。並且越來越多。隨著cs從業與求職者的增加,並伴隨大家都是「有備而來」的情況下,一般簡單的反轉鍊錶之類的題目已經無法再在面試中堅挺了。因此在求職者人數與招聘名額的比例較大的情況下,公司會傾向於出更難的面試問題。而動態規劃就是一種比較具有難度,又比較「好出」的面試問題。相比其他的演算法與資料結構知識來說,貪心法分治法太難出題了,搜尋演算法往往需要耗費求職者過長的程式編寫時間一般也不傾向於出,二叉樹鍊錶等問題題目並沒有那麼多,而且求職者也都會著重準備這一塊。因此動態規劃這一類的問題,便越來越多的出現在了面試中。

:我們將動態規劃的常見型別分為如下幾種:

其中,在技術面試中經常出現的是矩陣型,序列型和雙序列型。劃分型,區間型和揹包型偶爾出現。狀態壓縮和樹型基本不會出現(一般在演算法競賽中才會出現)。

每種型別都有著自己的題目特點和狀態的表示方法。以矩陣型動態規劃為例,一般題目會給你乙個矩陣,告訴你有乙個小人在上面走動,每次只能向右和向下走,然後問你比如有多少種方案從左上走到右下(不同的路徑link)。這種型別狀態表示的特點一般是使用座標作為狀態,如f[i][j]表示走到(i,j)這個位置的時候,一共有多少種方案。狀態的轉移則是考慮是從哪兒走到(i,j)這個座標的。而序列型的動態規劃,一般是告訴你乙個序列;雙序列的動態規劃一般是告訴你兩個字串或者兩個序列。

將所做過的動態規劃問題按照這些類別進行歸類,分析狀態的表示方法和狀態轉移方程的構造方法在每種型別中的近似之處,會讓你更快的學會動態規劃。

:可以使用動態規劃的問題一般都有一些特點可以遵循。如題目的問法一般是三種方式:

求最大值/最小值

求可不可行

求方案總數

如果你碰到乙個問題,是問你這三個問題之一的,那麼有90%的概率是使用動態規劃來求解。

要重點說明的是,如果乙個問題讓你求出「所有的」方案和結果,則肯定不是使用動態規劃。

著名的揹包九講:

揹包九講link

(也可以直接在網上搜尋揹包九講)

動態規劃專題課程,【全網稀缺】動歸高頻題彙總+解‎題要領,‎攻克面試‎難點

:首先根據「問5」判斷是否是動態規劃的問題,如果是,則嘗試將其按照「問4」進行分類,找到對應的類別和相似的問題。接著從下面的4個要素去逐步剖析解決這道題:

狀態是什麼

狀態轉移方程是什麼

狀態的初始值是什麼

問題要求的最後答案是什麼

每個步驟分析完成之後,就基本上解決了整道動態規劃的問題。

:一般來說,使用動態規劃求解的問題,時間上已經比暴力搜尋要優化很多了。但是仍然存在著一些可以優化的空間。通常來說,動態規劃的時間優化,有如下兩種常見的方式:

通過變換狀態優化

通過決策單調優化

對於通過變換狀態來優化的問題比較難,需要一些經驗和靈感。而對於決策單調的優化,則比較簡單,但適用範圍不廣,一般只適用於劃分型動態規劃當中,通常這個方法可以將複雜度降低乙個數量級。

:動態規劃的空間優化只有一種方法,就是使用滾動陣列進行優化。以乙個二維的動態規劃為例子。假如狀態轉移方程如下:f[i][j] = f[i - 1][j] + f[i][j - 1]。我們可以發現,第i層的狀態,已經和第i-2層的狀態沒有關係了,那麼這種情況下,用於儲存第i-2層的空間就可以被重複利用。方法非常簡單,把陣列的第一維對2取模就可以了:f[i % 2][j] = f[(i - 1) % 2][j] + f[i % 2][j-1]。這種方法通常可以將空間複雜度降低乙個數量級。

演算法 九 動態規劃

總結 動態規劃,一般來說,首先弄明白暴力遞迴怎麼做 嘗試 然後再優化 避免重複計算 把暴力遞迴的過程抽象成狀態表達。漢諾塔 漢諾塔問題 列印n層漢諾塔從最左邊移動到最右邊的全部過程 public class code 02 hanoi public static void func int rest...

動態規劃訓練之九

首先能夠想到是狀壓dp模板 取dp state,i,j 表示state狀態下倒數第二個島為i,最後乙個島為j時的最優解,num state,i,j 為相應的路徑數目,其中state的二進位制表示的i位為1表示島i被訪問過,反之為0。則顯然當有邊 i,j 存在時,有如下初值可賦 dp 1,表示此時可以...

動態規劃 九章演算法

最近看了九章演算法的動態規劃班,受益匪淺,一點簡要的筆記分享給大家 什麼是動態規劃?簡而言之,就是計算並儲存小問題的解,並將這些解組合成大問題的解。動態規劃題目的特點 1 計數 1 有多少種方式走到右下角 2 有多少種方法選出k個數使得和為sum 2 求最大值最小值 1 從左上角到右下角路徑的最大數...