日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)

發布時間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 漫画说算法--动态规划算法三(绝对通俗易懂,非常棒) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在前兩集漫畫中,我們通過一個算法問題的完整解題過程,講述了動態規劃的基本概念和思想。沒看過前兩集的朋友可以點擊下面的鏈接:

漫畫說算法–動態規劃算法一(絕對通俗易懂,非常棒)
漫畫說算法–動態規劃算法二(絕對通俗易懂,非常棒)

在第二集的末尾,給出了一道動態規劃的進階題目——國王和金礦。讓我們先來回顧一下問題:

有一個國家發現了5座金礦,每座金礦的黃金儲量不同,需要參與挖掘的工人數也不同。參與挖礦工人的總數是10人(第二集說的是1000人,這里改動一下)。每座金礦要么全挖,要么不挖,不能派出一半人挖取一半金礦。要求用程序求解出,要想得到盡可能多的黃金,應該選擇挖取哪幾座金礦?

下面,繼續我們的故事。

————————————

##方法一:排列組合

每一座金礦都有挖與不挖兩種選擇,如果有N座金礦,排列組合起來就有2^N種選擇。對所有可能性做遍歷,排除那些使用工人數超過10的選擇,在剩下的選擇里找出獲得金幣數最多的選擇。

代碼比較簡單就不展示了,時間復雜度也很明顯,就是O(2^N)。

F(n,w) = 0 (n<=1, w<p[0]);F(n,w) = g[0] (n==1, w>=p[0]);F(n,w) = F(n-1,w) (n>1, w<p[n-1]) F(n,w) = max(F(n-1,w), F(n-1,w-p[n-1])+g[n-1]) (n>1, w>=p[n-1])

其中第三條是補充上去的,原因不難理解。

##方法二:簡單遞歸

把狀態轉移方程式翻譯成遞歸程序,遞歸的結束的條件就是方程式當中的邊界。因為每個狀態有兩個最優子結構,所以遞歸的執行流程類似于一顆高度為N的二叉樹。

方法的時間復雜度是O(2^N)。

##方法三:備忘錄算法

在簡單遞歸的基礎上增加一個HashMap備忘錄,用來存儲中間結果。HashMap的Key是一個包含金礦數N和工人數W的對象,Value是最優選擇獲得的黃金數。

方法的時間復雜度和空間復雜度相同,都等同于備忘錄中不同Key的數量。

##方法四:動態規劃

方法利用兩層迭代,來逐步推導出最終結果。在外層的每一次迭代,也就是對表格每一行的迭代過程中,都會保留上一行的結果數組 preResults,并循環計算當前行的結果數組results。

方法的時間復雜度是 O(n * w),空間復雜度是(w)。需要注意的是,當金礦只有5座的時候,動態規劃的性能優勢還沒有體現出來。當金礦有10座,甚至更多的時候,動態規劃就明顯具備了優勢。

總結

以上是生活随笔為你收集整理的漫画说算法--动态规划算法三(绝对通俗易懂,非常棒)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。