1. 程式人生 > >關於動態規劃的思考

關於動態規劃的思考

個人 兩個 理解 使用 優化 ... 最長上升子序列 搜索 序列

動態規劃

個人理解的動態規劃就是,把大問題分解為好幾個小問題,然後通過保存式搜索的方法,進行更快的解決。這更像是遞歸的優化方法。

示例 最長上升子序列

一個數的序列bi,當b1< b2< ... < bS的時候,我們稱這
個序列是上升的對於給定的個序列(aaa ),
我們可以得到一些上升的子序列(ai1, ai2, ..., aiK),這裏1
<= i1< i2< ... < iK<= N

?比如,對於序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序
列,如(1, 7), (3, 4, 8)等等。這些子序列中最長的長度是4,
比如子序列(1 3 5 8)或(1 3 4 8)

?你的任務,就是對於給定的序列,求出最長上升子序
列的長度

首先,如果這道題使用遞歸的話。比如,記f(n)為一個長度為n的子序列,滿足最長上升子序的長度。但是,發現,f(n)和f(n-1),沒有數學關系的聯系。


考慮到,動態規劃是,空間換時間的一種思想。
求f(n)時,如果,f(n-1)==n-1,就是前n-1個是一個上升子序,那麽,只需要判斷,a[n]和a[n-1] 的關系。


但是,如果,f(n-1)<n-1;那麽,我們假設我們記錄了f(n-1)對應的包含a[n-1]的最新上升子序,同時比較a[n]和a[n-1]的大小,更新最新上升子序,並比較其長度和f(n-1),更新f(n).
也就是說,我們需要增加兩個int型變量,用於記載包含最新索引元素的上升子序列。

關於動態規劃的思考