您好,登錄后才能下訂單哦!
這篇文章主要介紹“什么是動態規劃”,在日常操作中,相信很多人在什么是動態規劃問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”什么是動態規劃”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
什么是動態規劃
動態規劃,英文:Dynamic Programming,簡稱DP,如果某一問題有很多重疊子問題,使用動態規劃是最有效的。
所以動態規劃中每一個狀態一定是由上一個狀態推導出來的,這一點就區分于貪心,貪心沒有狀態推導,而是從局部直接選最優的,
在關于貪心算法,你該了解這些!中我舉了一個背包問題的例子。
例如:有N件物品和一個最多能背重量為W 的背包。第i件物品的重量是weight[i],得到的價值是value[i] 。每件物品只能用一次,求解將哪些物品裝入背包里物品價值總和最大。
動態規劃中dp[j]是由dp[j-weight[i]]推導出來的,然后取max(dp[j], dp[j - weight[i]] + value[i])。
但如果是貪心呢,每次拿物品選一個最大的或者最小的就完事了,和上一個狀態沒有關系。
所以貪心解決不了動態規劃的問題。
其實大家也不用死扣動規和貪心的理論區別,后面做做題目自然就知道了。
而且很多講解動態規劃的文章都會講最優子結構啊和重疊子問題啊這些,這些東西都是教科書的上定義,晦澀難懂而且不太實用。
大家知道動規是由前一個狀態推導出來的,而貪心是局部直接選最優的,對于刷題來說就夠用了。
上述提到的背包問題,后序會詳細講解。
動態規劃的解題步驟
做動規題目的時候,很多同學會陷入一個誤區,就是以為把狀態轉移公式背下來,照葫蘆畫瓢改改,就開始寫代碼,甚至把題目AC之后,都不太清楚dp[i]表示的是什么。
這就是一種朦朧的狀態,然后就把題給過了,遇到稍稍難一點的,可能直接就不會了,然后看題解,然后繼續照葫蘆畫瓢陷入這種惡性循環中。
狀態轉移公式(遞推公式)是很重要,但動規不僅僅只有遞推公式。
對于動態規劃問題,我將拆解為如下五步曲,這五步都搞清楚了,才能說把動態規劃真的掌握了!
確定dp數組(dp table)以及下標的含義
確定遞推公式
dp數組如何初始化
確定遍歷順序
舉例推導dp數組
一些同學可能想為什么要先確定遞推公式,然后在考慮初始化呢?
因為一些情況是遞推公式決定了dp數組要如何初始化!
后面的講解中我都是圍繞著這五點來進行講解。
可能刷過動態規劃題目的同學可能都知道遞推公式的重要性,感覺確定了遞推公式這道題目就解出來了。
其實 確定遞推公式 僅僅是解題里的一步而已!
一些同學知道遞推公式,但搞不清楚dp數組應該如何初始化,或者正確的遍歷順序,以至于記下來公式,但寫的程序怎么改都通過不了。
后序的講解的大家就會慢慢感受到這五步的重要性了。
動態規劃應該如何debug
相信動規的題目,很大部分同學都是這樣做的。
看一下題解,感覺看懂了,然后照葫蘆畫瓢,如果能正好畫對了,萬事大吉,一旦要是沒通過,就怎么改都通過不了,對 dp數組的初始化,遞歸公式,遍歷順序,處于一種黑盒的理解狀態。
寫動規題目,代碼出問題很正常!
找問題的最好方式就是把dp數組打印出來,看看究竟是不是按照自己思路推導的!
一些同學對于dp的學習是黑盒的狀態,就是不清楚dp數組的含義,不懂為什么這么初始化,遞推公式背下來了,遍歷順序靠習慣就是這么寫的,然后一鼓作氣寫出代碼,如果代碼能通過萬事大吉,通過不了的話就憑感覺改一改。
這是一個很不好的習慣!
做動規的題目,寫代碼之前一定要把狀態轉移在dp數組的上具體情況模擬一遍,心中有數,確定最后推出的是想要的結果。
然后再寫代碼,如果代碼沒通過就打印dp數組,看看是不是和自己預先推導的哪里不一樣。
如果打印出來和自己預先模擬推導是一樣的,那么就是自己的遞歸公式、初始化或者遍歷順序有問題了。
如果和自己預先模擬推導的不一樣,那么就是代碼實現細節有問題。
這樣才是一個完整的思考過程,而不是一旦代碼出問題,就毫無頭緒的東改改西改改,最后過不了,或者說是稀里糊涂的過了。
這也是我為什么在動規五步曲里強調推導dp數組的重要性。
舉個例子哈:在「代碼隨想錄」刷題小分隊微信群里,一些錄友可能代碼通過不了,會把代碼拋到討論群里問:我這里代碼都已經和題解一模一樣了,為什么通過不了呢?
發出這樣的問題之前,其實可以自己先思考這三個問題:
這道題目我舉例推導狀態轉移公式了么?
我打印dp數組的日志了么?
打印出來了dp數組和我想的一樣么?
如果這靈魂三問自己都做到了,基本上這道題目也就解決了,或者更清晰的知道自己究竟是哪一點不明白,是狀態轉移不明白,還是實現代碼不知道該怎么寫,還是不理解遍歷dp數組的順序。
然后在問問題,目的性就很強了,群里的小伙伴也可以快速知道提問者的疑惑了。
注意這里不是說不讓大家問問題哈, 而是說問問題之前要有自己的思考,問題要問到點子上!
大家工作之后就會發現,特別是大廠,問問題是一個專業活,是的,問問題也要體現出專業!
如果問同事很不專業的問題,同事們會懶的回答,領導也會認為你缺乏思考能力,這對職場發展是很不利的。
所以大家在刷題的時候,就鍛煉自己,養成專業提問的好習慣。
到此,關于“什么是動態規劃”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。