前言
今天我們繼續討論經典的動態規劃問題之最長上升子序列問題。
最長上升子序列問題
問題描述
給定一個數字序列A,求該序列中最長上升子序列的長度。例如A={1,4,2,5,3},其最長上升子序列為{1,2,3},因此最長上升子序列的長度為3。
問題分析
假設序列長度為
,構建一個長度為
的一維數組
,
代表了以
結尾的上升子序列的長度。很顯然,
,最長上升子序列的長度為
。
代碼實現
通過問題分析,可以很容易得用代碼實現,下面給出算法的java實現。
public class LongestIncreasingSubsequence {
public int getLIS(int[] A, int n) {
return core(A, n);
}
// 動態規劃
public static int core(int[] A, int n) {
if (n == 0) {
return 0;
}
int[] dp = new int[n];
dp[0] = 1;
for (int i = 1; i < n; i++) {
int max = 0;
for (int j = 0; j < i; j++) {
if (A[i] > A[j]) {
max = Math.max(max, dp[j]);
}
}
dp[i] = max + 1;
}
int res = 0;
for (int i = 0; i < n; i++) {
if (res < dp[i]) {
res = dp[i];
}
}
return res;
}
public static void main(String[] args) {
LongestIncreasingSubsequence main = new LongestIncreasingSubsequence();
int[] A = new int[]{1, 4, 2, 5, 3};
int n = 5;
System.out.println(main.getLIS(A, n));
}
}
經典問題
- 算法思想之動態規劃(二)——最小路徑和問題
- 算法思想之動態規劃(三)——找零錢問題
- 算法思想之動態規劃(四)——最長公共子序列問題
- 算法思想之動態規劃(五)——最小編輯距離問題
- 算法思想之動態規劃(七)——背包問題
未來幾篇博文,我將繼續對經典的動態規劃問題進行整理,敬請關注~
由于本人水平有限,文章難免有欠妥之處,歡迎大家多多批評指正!
寫在最后
歡迎大家關注我的個人博客復旦猿。