引出:
問題描述:給出乙個序列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。說明 可能會有多種最長上公升子串行的組合,你只需要輸出對...