解法一 根據無后效性的定義我們知道,將各階段按照一定的次序排列好之后,對于某個給定的階段狀態來說,它以前各階段的狀態無法直接影響它未來的決策,而只能間接地通過當前的這個狀態來影響。換句話說,每個狀態都是歷史的一個完整總結。 同樣的,仍以序列1,-1,2,-3,4,-5,6,-7為例,我們在找到4之后,并不關心4之前的兩個值具體是怎樣,因為它對找到6沒有直接影響。因此,這個問題滿足無后效性,可以通過使用動態規劃來解決。 可以通過數字的規律來分析目標串:1,-1,2,-3,4,-5,6,-7。 使用i來表示當前遍歷的位置 當i=1時,顯然,最長的遞增序列為(1),序列長度為1. 當i=2是,由于-1<1。因此,必須丟棄第一個值后重新建立串。當前的遞增序列為(-1),長度為1。 當i=3時,由于2>1,2>-1。因此,最長的遞增序列為(1,2),(-1,2),長度為2。在這里,2前面是1還是-1對求出后面的遞增序列沒有直接影響。(但是在其它情況下可能有影響) 依此類推之后,我們得出如下的結論。 假設在目標數組array[]的前i個元素中,最長遞增子序列的長度為LIS[i]。那么, LIS[i+1]=max{1,LIS[k]+1}, array[i+1]>array[k], for any k <= i 即如果array[i+1]大于array[k],那么第i+1個元素可以接在LIS[k]長的子序列后面構成一個更長的子序列。于此同時array[i+1]本身至少可以構成一個長度為1的子序列。 根據上面的分析,就可以得到代碼清單: C++代碼: