動態規劃概念及應用

前言:

學習計算機,有一項是你永遠逃不掉的,那就是刷題。。。(好像其他科目也是一樣)而刷題呢,又肯定離不開那萬惡的OJ,從註冊賬號開始,我便每天受着這破玩意兒的折磨(此處刷過OJ的人會理解我的),但刷着刷着,我驚奇的發現裏面有好多問題都與動態規劃有關,便搜了搜看了看大佬們的博客,來這裏總結一下。

動態規劃:

維基百科說得好,動態規劃就是通過把原問題分解爲相對簡單的子問題的方式求解複雜問題的方法。

說白了就是:

1. 這個問題可以分解爲子問題

2. 原問題與子問題有關係

3. 子問題可以求解

說到這裏,你是不是想到了遞歸,想到了數學歸納法,其實他們都是相通的。(哇哦,瞬間覺得學科之間原來真的是有聯繫的)

看到這裏,你是不是覺得動態規劃挺簡單的嘛,就是三個步驟嘛:

1. 把原問題分解爲子問題

2. 找到原問題與子問題的關係

3. 記錄下子問題的解

emmm,就是這三個簡單的步驟,難倒了多少好漢啊(也包括我),下面我們就通過分析一些使用動態規劃解決的問題來摸索這三步怎麼找。

動態規劃的常見應用:

1. 斐波那契數列:

1 1 2 3 5 8 13。。。

我們要求第n個數,即f(n)

a. 分解問題:求f(n)就是求f(n - 1) 與 f(n - 2)

b. 關係:f(n) = f(n - 1) + f(n - 2)

這樣,在f(1) 與 f(2) 已知的情況下,我們便可以求得f(n)。

看到這裏,你可能會說這不是明顯的遞歸嗎,怎麼是動態規劃呢?這裏便要提出動態規劃與遞歸的不同,若用遞歸,求f(100)就要求f(99) 與 f(98), 求f(99)就要求f(98) 與f(97),此時f(98)算了兩遍,而使用動態規劃,它存儲了f(98),後面用的時候便不需要再重新計算,能夠省下來許多時間,這便是傳說中動態規劃記憶化存儲的性質。

 

2. 之後慢慢補充

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章