動態規劃之《尋找最大上公升序列》

2022-08-17 01:30:22 字數 1251 閱讀 9179

問題描述:給出乙個序列a1,a2,a3,a4,a5,a6,a7….an,求它的乙個子串行(設為s1,s2,…sn),使得這個子串行滿足這樣的性質,s1< s2< s3< …< sn並且這個子串行的長度最長。找出這個最長序列。(為了簡化該類問題,我們將諸如最長下降子串行及最長不上公升子串行等問題都看成同乙個問題,其實仔細思考就會發現,這其實只是《符號定義上的問題,並不影響問題的實質)

例如有乙個序列:1 7 3 5 9 4 8,它的最長上公升子串行就是 1 3 4 8 長度為4.

這是乙個典型的動態規劃問題,動態規劃的本質是什麼,就是問題階段的劃分和遞迴公式!

問題階段的劃分

所以我們來重新定義這個問題:

給定乙個數列,長度為n,

設fk為:以數列中第k項結尾的最長遞增子串行的長度.

求f1..fn 中的最大值.

很容易發現現在這個問題已經是乙個n階段的問題了。

遞推公式

fk的值應該這樣得到,尋找出max (ai< aj)。

那麼我們的思路就應該已經很清晰了。

#include

2#include

3#include45

#define maxsize 1000

6using

namespace

std;

7#include

8vector

lis(vector

input)

1920 }

2122 }

23//find the max_index

24int max=-int_max;

25int max_index=0;

26for(int i=0;i27

if(d[i]>max)

3132 }

33//find the path by p

34int fa;

35vector

ans;

36for(fa=max_index;fa!=p[fa];fa=p[fa])

39 ans.push_back(input[fa]);

40 reverse(ans.begin(),ans.end());

41return ans;

42 }

int main()

動態規劃 最大上公升子串行

乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等。這些子串...

動態規劃例題 最大上公升自序列

問題描述 乙個數的序列 bi,當b1 b2 bs 的時候,我們稱這個序列是上公升的。對於給定的一 個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8...

動態規劃 求最大上公升子串行

問題描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...