算法思想之動態規劃(六)——最長上升子序列問題

前言

今天我們繼續討論經典的動態規劃問題之最長上升子序列問題

最長上升子序列問題

問題描述

給定一個數字序列A,求該序列中最長上升子序列的長度。例如A={1,4,2,5,3},其最長上升子序列為{1,2,3},因此最長上升子序列的長度為3。

問題分析

假設序列A長度為n,構建一個長度為n的一維數組dp[n]dp[i]代表了以A[i]結尾的上升子序列的長度。很顯然,dp[i] = 1 + max\{dp[j] | A[j] < A[i] 且 j < i \} ,最長上升子序列的長度為max\{dp[i] \}

代碼實現

通過問題分析,可以很容易得用代碼實現,下面給出算法的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));
    }
}

經典問題

未來幾篇博文,我將繼續對經典的動態規劃問題進行整理,敬請關注~
由于本人水平有限,文章難免有欠妥之處,歡迎大家多多批評指正!

寫在最后

歡迎大家關注我的個人博客復旦猿

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容