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;
    }


猜你喜欢

转载自blog.csdn.net/Uupton/article/details/80585764