lis:從一串數字序列,找出連續遞增的子串行,並且要求子串行最長!
舉例:
一段序列:1,6,2,3,7,5,9,4,11那麼我們如何通過**實現呢?最長上公升子串行為:1,2,3,7,9,11
我們需要乙個陣列f,然後通過f記錄每乙個數字的最大上公升子串行。
初始時每乙個f[i]=1,因為那怕找不到任意乙個子串行,那麼他們自身也算是最長上公升子串行。
(最長上公升子串行不一定為乙個,可能長度相同的多個!)
我先把**展示出來,然後詳細給大家講解如何實現!
for
(int i=
1; i<=n; i++
)}
第一重for迴圈遍歷n個數字a[1]~a[n]我帶大家模擬一下!第二重for迴圈找到a[1]~a[i]的所有數字
我們先判斷當前a[j]是否小於a[i]
如果不小於那麼a[j]一定無法與a[i]在同一串的序列!
如果滿足條件,那麼我們判斷一下,以a[j]截至的最長子序列f[j]在加上1,也就是這個序列帶上a[i]後,與a[i]自身的f[i]進行比較取出最大的序列,賦值給f[i]。
已知序列:1、3、2、5、4、7、6
i=1,a[1]=1,f[1]=1 j不滿足小於i跳過
i=2,a[2]=3,f[2]=1,j=1,1<3,f[2]i=3,a[3]=2,f[3]=1,j=1,1<2,f[3]2,不滿足條件,跳過
i=4,a[4]=5,f[4]=1,j=1,1<5,f[4]i=5,a[5]=4,j=1和上面相同,我直接寫,f[4]=f[1]+1=2,j=2,f[4]=f[2]+1=3,j=3 f[4]不變,j=4,5>4,不滿足跳出迴圈
i=6,a[6]=7,通過以上相比大家可以直接寫出最終f[7]=f[4]+1=4此時最長上公升子串行,有兩個哦!1357,1247!
i=7,a[7]=6,f[6]=f[4]+1=4 因為7>6所以j=6時跳出迴圈。完結撒花!最後我們遍歷f陣列,找出最大的值即,最長子序列!!!
附**:
for
(int i=
1; i<=n; i++
)
最長上公升子串行 LIS
題目 兩道題幾乎一樣,只不過對於輸入輸出的要求有所不同罷了。lis有兩種方法 一 第一種方法 時間複雜度為o n 2 狀態 dp i 區間為0 i的序列的lis 轉移方程 dp i max 1,dp k 1 0 k include include include include using name...
最長上公升子串行LIS
問題 給定n個整數a1,a2,a3,a4,a5,an,從左到右的順序盡量選出多個整數,組成乙個上公升子串行,相鄰元素不相等。例如 1,6,2,3,7,5,它的最長上公升子串行為 1,2,3,5。分析 剛開始想這個問題的時候我想用遞迴來解決問題,可是後來考慮到遞迴的時間複雜度高,就覺得不能使用,並且本...
LIS 最長上公升子串行
最長遞增子串行問題 在一列數中尋找一些數,這些數滿足 任意兩個數a i 和a j 若i 設dp i 表示以i為結尾的最長遞增子串行的長度,則狀態轉移方程為 dp i max,1 j 這樣簡單的複雜度為o n 2 其實還有更好的方法。考慮兩個數a x 和a y x 按dp t k來分類,只需保留dp ...