動態規劃 最長子序列

2021-06-03 13:19:44 字數 1269 閱讀 7018

引出:

問題描述:給出乙個序列a1,a2,a3,a4,a5,a6,a7….an,求它的乙個子串行(設為s1,s2,…sn),使得這個子串行滿足這樣的性質,s1分析:

這題目是經典的dp題目,也可叫作最長上公升子串行或者 最長不下降子串行。有兩種演算法,複雜度分別為o(n*logn)和o(n^2) 。

演算法1:

時間複雜度:o(n^2):

依次遍歷整個序列,每一次求出從第乙個數到當前這個數的最長上公升子串行,直至遍歷到最後乙個數字為止,然後再取dp陣列裡最大的那個即為整個序列的最長上公升子串行。我們用dp[i]來存放序列1-i的最長上公升子串行的長度,那麼dp[i]=max(dp[j])+1,(j∈[1, i-1]); 顯然dp[1]=1,我們從i=2開始遍歷後面的元素即可。

int dp[1000];

int lis(int arr[1000], int n)

dp[i] = ans+1;

} ans = 0;

for(int i=1; i<=n; ++i)

return ans;

}

演算法2:

時間複雜度:(nlogn):

除了演算法一的定義之外(p【i】相當於演算法一中的arr【i】),增加乙個陣列b,b[i]用以表示長度為i最長子序列的最後乙個數最小可以是多少。易證:i= b[k], 則b[k+1] = arr[i];

若2. arr[i] <  b[k], 則在b[1..k]中用二分搜尋大於arr[i]的最小值,返回其位置pos,然後更新b[pos]=arr[i]。

// num為要查詢的數,k是範圍上限

// 二分查詢大於num的最小值,並返回其位置

int bsearch(int num, int k)

return low;

}

int lis()

} return k;

}

以下是證明b的單調遞增性:

b序列是嚴格遞增的,即b[1] < b[2] < … < b[t]。

證明:若b[i] >= b[i + 1],b[i + 1] 是長度為i+1的遞增子串行的尾項的最小值,設此序列為x[1]..x[i+1],x[1]..x[i]即構成長度為i的遞增子串行,x[i] < x[i+1] = b[i+1] <= b[i],與b[i]定義不符。

動態規劃 最長子序列

引出 問題描述 給出乙個序列a1,a2,a3,a4,a5,a6,a7 an,求它的乙個子串行 設為s1,s2,sn 使得這個子串行滿足這樣的性質,s1分析 這題目是經典的dp題目,也可叫作最長上公升子串行或者 最長不下降子串行。有兩種演算法,複雜度分別為o n logn 和o n 2 演算法1 時間...

動態規劃最長子序列

給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行。乙個字串的 子串行 是指這樣乙個新的字串 它是由原字串在不改變字元的相對順序的情況下刪除某些字元 也可以不刪除任何字元 後組成的新字串。例如,ace 是 abcde 的子串行,但 aec 不是 abcde 的子串行。兩個字串的...

動態規劃 最長子序列

longest increasing subsequence 給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。示例 輸入 10,9,2,5,3,7,101,18 輸出 4 解釋 最長的上公升子串行是 2,3,7,101 它的長度是 4。說明 可能會有多種最長上公升子串行的組合,你只需要輸出對...