Leetcode300——最長上升子序列(動態規劃)
阿新 • • 發佈:2019-02-13
題目描述:給定一個無序的整數陣列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; }