1. 程式人生 > >Leetcode300——最長上升子序列(動態規劃)

Leetcode300——最長上升子序列(動態規劃)

題目描述:給定一個無序的整數陣列num,找到其中最長上升子序列的長度。

示例:

輸入:[10,9,2,5,3,7,101,18]

輸出:4

解釋:最長的上升子序列是[2,3,7,101],它的長度是4

典型的動態規劃題目,定義一個數組dp,其中dp[i]代表以第num[i]為結尾取得的最長長度,最後返回最大的那個dp[i]就行了,

所以這道題的重點在於怎麼求得dp[i]。一開始我們先把dp全部元素都初始化為1,因為dp[i]無論如何最少的長度都是1(只有本身一個元素的序列),然後對於每個num[i]我們可以通過遍歷num[0]~num[i-1],如果在這個區間找到一個num[j]比num[i]小,那麼開始比較dp[j]+1和dp[i]的大小,如果dp[j]+1>dp[i]則更新dp[i],所以轉移方程為dp[i] = max(dp[j]+1,dp[i])。

AC程式碼如下

int lengthOfLIS(vector<int>& nums) {
        if(nums.empty()) return 0;
        int len = nums.size();
        vector<int> dp(len,1);
        int ans = 1;
        for(int i = 0;i<len;i++)
        {
            for(int j = 0;j<i;j++)
            {
                if(nums[i]>nums[j])
                {
                    dp[i] = max(dp[i],dp[j]+1);
                }
                if(dp[i]>ans) ans = dp[i];
            }
        }
        return ans;
    }