展開目錄

基本概念

用現實的例子引導出動態規劃的概念,故意先不給定義

作者
baluteshih
先備知識

何謂動態規劃?

動態規劃最核心的概念就在於「用記憶換取時間」。

什麼意思呢?記憶到底多有幫助?設想今天你在一個陌生的環境必須想辦法回家,當人生地不熟又沒導航時,只能盲目的胡亂逛街,但一旦——我們說假設你碰巧走到了學校前面——回家的路是否就瞬間明朗了呢?這是因為你「記著」從學校回家的路,進而大大省下了繼續從學校尋找回家路線的時間。

不過更多時候我們甚至不需要這個「碰巧」,學校這個地方通常都是很醒目的地點,也因此附近常會有一些地標等等的指示物可以參考,這樣只要記下從學校回家的路,當在學校附近時就都可以嘗試先很簡單的沿著看得到的指示走向學校,再走自己記憶中回家的路到家就可以了,這下在學校附近亂逛再也不怕迷路!

也因此,上面的例子不只告訴了我們「用記憶換取時間」的方便性,還順便告訴了我們「記也要記得好」,把整張地圖背起來若辦得到固然可以換取更多時間,但記憶力可是有限的!

讓我們回到程式競賽,在動態規劃這個章節,我們將會需要解決相當多的「問題」,而目標當然是要想辦法找到這些問題的「解答」。當要使用動態規劃時,我們在設計演算法就要考慮以下幾個東西:

  • 我們要用記憶省下什麼東西?
    • 省下每次在學校附近玩耍時找路的時間,因為我們會在學校附近玩很多次,而不是浪費記憶力去記一些不常去的地方。
  • 我們要記哪些東西?
    • 只要記下學校走到回家的路就好。
  • 我們要怎麼快速的找到並利用記下來的東西?
    • 學校很醒目,所以能很快又不費力的找到!

在接下來的章節,我們會嘗試用一些實際的題目來引導出動態規劃的概念,並在適當的時機再幫讀者做個整理。

NTUCPC Logo
國立臺灣大學程式解題社NTU Competitive Programming Club
This work is licensed under CC BY-SA 4.0