【README1】动态规划之解题思路
文章目錄
- 一:動態規劃介紹
- 二:如何寫出狀態轉移方程
- 三:動態規劃框架
一:動態規劃介紹
動態規劃(Dynamic Programming)的問題應該讓大家很是頭疼,因為它只要一出現,就代表了這十有八九是個難題。
動態規劃類的題目有一個特點就是求最值,比如經典的最長遞增子序列,最小編輯距離等等。既然是求最值,那么肯定要有一個比較的過程,不然這個“最”談何而來呢,所以求最值往往意味著你要列出所有的可能情況,然后求最值。
列出所有的情況也就意味著窮舉,但是動態規劃的窮舉有些特點,就是你如果暴力窮舉會存在很多很多的重疊子問題,什么是重疊子問題呢?斐波那契數列大家肯定知道,你是否記得在求斐波那契數的時候有一部分數會被反復重復計算多次?
正是因為這樣的重疊子問題,導致采用遞歸的方式完成斐波那契數列這種題,當給定的輸入過大時,將會導致非常大的時間復雜度。所以你們經常聽到過的備忘錄或者dp數組就是為了解決這樣的重疊問題的
然后動態規劃問題一定會具有 “最優子結構” 的性質。什么是最優子結構呢?舉個簡單的例子,你們學校有20個班,并且已經知道每個班最高分,那么我想統計全校成績最高分是多少,這該怎么辦呢?我想在這樣的情況下,你肯定不會遍歷全校同學,你會直接比較每個班的最高分,那么在這里 班里最高的就是全校最高的最優子結構
最后,雖然說動態規劃的核心思想就是窮舉所有情況,但是它的窮舉相比于回溯等算法來說難度還是挺高的,而且情況千變萬化,所以如何正確列出 “狀態轉移方程” 才是關鍵
二:如何寫出狀態轉移方程
再次重復,動態規劃的三要素
其中能否寫出狀態轉移方程直接決定了你是否可以做出相應的題目
在寫狀態轉移方程前你一定要思考以下幾點
三:動態規劃框架
還是那句話,世界上沒有萬能的模板可以解決任何題目這里的框架也不像數學公式那樣代入進去就能有正確答案,所謂的框架其實就是給你一個思考方向,你能知道這一步,下一步應該干嘛,不至于胡思亂想。最最最重要的其實還是你的理解力
# 初始化base case dp[0][0][...]=base case; # 狀態轉移 for 狀態1 in 狀態1 的所有取值for 狀態 2 in 狀態2的所有取值for...dp[狀態1][狀態2][...]=求最值(選擇1,選擇2,...);接下文:【README2】動態規劃之斐波那契數列說明重疊子問題如何解決
總結
以上是生活随笔為你收集整理的【README1】动态规划之解题思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu_5085_Counting pr
- 下一篇: 各类最新Asp .Net Core 项目