動態規劃 最長遞增子串行

2021-09-12 06:26:45 字數 2515 閱讀 7421

給出序列:

1 2 3 4 2 5 3 4

a[1]=1,a[2]=2,…,a[7]=3,a[8]=4

求其最長的遞增子串行,以上最長遞增子串行為:1 2 3 4 5

問題細分

初始化條件f[1]:1,序列只有1個長度即為1

f[2]:a[2]與下標小於2的比較,即a[1]比較,a[2]>a[1],因此更新f[2] = f[1]+1 =2,取f[1~2]最大值2

f[3]:a[3]與下標小於3的比較,即a[1],a[2]比較,a[3]>a[2]>a[1],因此更新f[3] = f[2]+1 =3,取f[1~3]最大值3

f[4]:a[4]與下標小於4的比較,即a[1],a[2],a[3]比較,a[4]>a[3]>a[2]>a[1],因此更新f[4] = f[3]+1 =4,取f[1~4]最大值4

f[5]:a[5]與下標小於5的比較,即a[1],a[2],a[3],a[4]比較,a[5]>a[1],因此更新f[5] = f[1]+1 =2 ,取f[1~4]最大值4,f[5]更新

f[6]:a[6]與下標小於6的比較,即a[1],…a[5]比較,a[6]>a[4],因此更新f[6] = f[4]+1 =5 ,取f[1~6]最大值5

f[7]:a[7]與下標小於7的比較,即a[1],…a[6]比較,a[7]>a[2],因此更新f[7] = f[2]+1 =3 ,取f[1~7]最大值5,f[7]更新

f[8]:a[8]與下標小於8的比較,即a[1],…a[7]比較,a[8]>a[3],因此更新f[8] = f[3]+1 =4 ,取f[1~8]最大值5,f[8]更新

f[i]:a[i]與下標小於i的比較,注意是所有,如 7 8 1 2 3 8,第一次8>7進行更新,可是8同樣大於1 2 3,因此需要遍歷完(也可以這樣理解,f[i]表示以a[i]結尾!!!的最長遞增子串行),然後取最大值作為f[i],最後再從f[1~i]取最大值,若發現f[i]不是最大值,則更新f[i]的數值為所求得的最大值,所以說:要求兩次最大值 m_m,因此再求乙個序列的最大子串行長度時,可以不必要每個f[i]都求得,在保證最長子序列不變的情況下,通過最後一次遍歷,找到最大值即為所求,於是有方法二,下面給出上方所列方法一的各個f情況:

方法一:12

3425

34f[1]

f[2]

f[3]

f[4]

f[5]

f[6]

f[7]

f[8]12

3445

55這裡比較方式可能和課本有些不同,因為每次求得f[i],並比較了f[1~i]並取最大值。

方法二:有些地方在求乙個序列最大的遞增子串行長度時也可以每次獲得f[i]後不進行取最大值,而是求得所有f[i],後再求f[i~n]中最大值作為,序列最大遞增子串行的長度,這種做法,可行,但是f[i]並不是代表a[1],…a[i]的最長遞增子串行長度,而是表示以a[i]結尾的最長遞增子串行長度,這裡列出這種方式求得的f[i]

方法二:12

3425

34f[1]

f[2]

f[3]

f[4]

f[5]

f[6]

f[7]

f[8]12

3425

34可以看到f[5]為2,這是因為新增了a[5]=2進序列,a[5]>a[1],只能說新增了a[5]的作用只是延長a[1]序列,故f[5]=f[1]+1=2,但 1 2 3 4 2 最長的遞增子串行依舊是 1 2 3 4 ,所以a[5]的新增對其無影響,因此在求最後總的最長遞增子串行時,可以只進行一次求最大值操作,還需要注意的是,要是a[i]不大於它之前所有的a,如a[5] =0,此時f[5],人為給其設定為1

給出最長遞增子串行遞推公式:

f[1] = 1;

f[i] = max;

#include

#include

#define n 25

using namespace std;

int missile[n+1]

;int dp[n]

;int

max(

int a,

int b)

void

lis(

int k)

} dp[x]

= tmax;

//cout << setw(3)<< dp[x] << " ";}}

intmain()

lis(k)

;int ans =1;

for(

int i =

1; i <= k; i++

) cout << ans << endl;

return0;

}/*61 4 3 2 6 5

8300 207 155 300 299 170 158 65

*/

動態規劃 最長遞增子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度 例項 輸入 10,9,2,5,3,7,101,18 輸出 4 解釋 最長的上公升子串行為 2,3,7,101 長度為4說明 可能會有多種最長上公升子串行的和,只需要輸出對應長度即可 演算法的時間複雜度應為o n2 首先,dp陣列的定義如下 dp...

動態規劃 最長遞增子串行

最長遞增子串行是動態規劃中最經典的問題之一,該問題描述的是在乙個已知序列中,取出若干元素 不必連續 組成乙個新的序列,子串行的各個數先後順序保持不變,且對子序列中的任意下標x令dp i 表示以a i 作為末尾的最長遞增子串行的長度。於是,通過設定這麼乙個陣列,最長遞增子串行的長度便是陣列dp中的最大...

動態規劃 最長遞增子串行

經典的最長子序列問題,最近程式設計訓練遇到此題苦無思路,在網上找到比較規範的解答,細思兩天後還是覺得有點問題,現在整理總結如下 參照 1.問題描述 給定乙個序列,求解它的最長 遞增 子串行 的長度。比如 arr 的最長遞增子串行長度為4。即為 1,4,5,9 2.dp演算法分析 按照上述作者的解答 ...