C語言學習筆記 演算法篇 動態規劃

2021-10-25 05:14:58 字數 2054 閱讀 9243

寫在前面:

學習這個演算法的緣由其實是這篇部落格,當時在寫完這道題的題解時,師兄好心地提醒我有乙個說法不太準確,就是到底是不是貪心演算法,在學習了動態規劃後發現這兩者真的有挺多共同點的。且上次月賽挺多題目都涉及到了動態規劃的思想,故今天來整理一下,先立個flag,這篇部落格應該要寫很久很久很久…

首先要了解的是,和貪心演算法一樣,動態規劃演算法只是一種思想,不是像排序演算法一樣有具體的**。

一些重要筆記

沿著一列往下走時,最大價值不可能降低,因為每次迭代時,你都儲存當前的最大價值。最大價值不可

能比以前低!

要以最小單位劃分**

要逐行填充不要逐列填充

使用動態規劃時,要麼考慮拿走整件商品,要麼考慮不拿,而沒法判斷該不該拿走商品的一部分。但使用貪婪演算法可輕鬆地處理這種情況!

。動態規劃功能強大,它能夠解決子問題並使用這些答案來解決大問題。但僅當每個子問題都是離散的,即不依賴於其他子問題時,動態規劃才管用 。

根據動態規劃演算法的設計,最多隻需合併兩個子揹包,即根本不會涉及兩個以上的子揹包。不過這些子揹包可能又包含子揹包。

最優解的情況可能沒利用完空間/時間

9.4 小結

需要在給定約束條件下優化某種指標時,動態規劃很有用。

問題可分解為離散子問題時,可使用動態規劃來解決。

每種動態規劃解決方案涉及網格。

單元格中的值通常就是你要優化的值。

每個單元格都是乙個子問題,因此你需要考慮如何將問題分解為子問題。

沒有放之四海皆準的計算動態規劃解決方案的公式。

我覺得書上面的一些理解已經非常詳細且準確了,這裡就不再重複敘述了。這裡我想再重複一點的就是這句話每種動態規劃解決方案都涉及網格。這句話已經非常的絕對了,而往往在題目中的表現就是用二維陣列來建立「**」,在根據題目背景寫入值的同時計算出結果。

2020/11/6修正一下,不是所有的dp都是二維的,有一維的也有三維四維高維的dp,但大部分常見的都是二維的,或者說高維可以優化降到二維,或者一維可以用二維輕鬆解決。

依舊引用《演算法**》的文字

要設計出動態規劃解決方案可能很難,這正是本節要介紹的。下面是一些通用的小貼士。

1.每種動態規劃解決方案都涉及網格。

2.單元格中的值通常就是你要優化的值。在前面的揹包問題中,單元格的值為商品的價值。

3.每個單元格都是乙個子問題,因此你應考慮如何將問題分成子問題,這有助於你找出網格的座標軸。

其實,根據上述的內容,好像對做題還是沒有很明確的指示,那麼再往下讀,你就看到

用於解決這個問題的網格是什麼樣的呢?要確定這一點,你得回答如下問題。

1.單元格中的值是什麼?

2.如何將這個問題劃分為子問題?

3.網格的座標軸是什麼?

!!!這三個條件是可執行的,不想上方的小貼士,那更像是大量統計的統計結果而已,而這三條才是正在解決問題的方向,當自己很疑惑,不知道要如何去設計這道題的動態規劃時,不妨試試先從解決這三個問題開始,值是什麼?如何劃分為子問題?座標軸是什麼?其實當你解決了這三個問題,題目也就迎刃而解了。

實際上,根本沒有找出計算公式的簡單辦法,你必須通過嘗試才能找出管用的公式。有些演算法並非精確的解決步驟,而只是幫助你理清思路的框架。

書上當時還幽默地提到了費曼演算法,不要想著絕對通用的方法。

之前我的部落格有**過dfs,其實dfs我也只是略懂一二,不能給出很深刻的見解,但我這裡強烈推薦乙個博主的分析,語言通俗易懂,結合案例講解,也講述了dp中幾個重要的概念,非常適合新手閱讀。

acm0基礎動態規劃啟蒙:dp是個啥

dp與貪心最大的區別,可能就是結果了,貪心是利用區域性最優解來求整體最優解,但往往有些情況下,區域性最優的和並不是整體最優,因為你忽略了全域性觀,貪心的每一步都只關係這一步的最優,而沒有放眼全域性頂層設計,這也是導致結果不一定是最優的原因。其實貪心二字就給人感覺鼠目寸光的感覺,沒有大局觀。

c語言學習篇

c語言 編譯 執行c程式 include intmain 1.了解c語言結構 main 主函式,所有c語言程式都要包含主函式,從main 函式開始執行 include 是乙個預處理的命令,用來引入標頭檔案 stdio.h 是乙個標頭檔案 標準輸入輸出標頭檔案 printf 格式化輸出到螢幕。prin...

C語言學習筆記 動態陣列

陣列是c語言中的很重要的一種構造型別,最初我們學習的都是靜態陣列,但是,靜態陣列有著自己難以改變的缺點 陣列長度固定。一般在靜態陣列定義後,系統就會為其分配對應長度的連續的專有記憶體空間,可是,我們都知道,不同的執行樣例,所需要的陣列長度是不一樣的,為了所有樣例都可以執行,一般我們會將陣列長度設定為...

c語言學習日記 排序演算法篇

1.快速排序 排序原理 快速排順是對氣泡排序改進,首先這頂乙個值,通過該值將 陣列分為2個部分,小於基準數的放到左邊,大於基準數的放到右邊。之後左右兩邊的資料分別進行排序,而左右兩邊的排序依舊可以採用設定乙個值兩邊排序,這是乙個遞迴的思想。演算法實現 public static void quick...