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