leetcode 300. Longest Increasing Subsequence
目录
题目描述
第一步,明确并理解dp数组及下标的含义
第二步,分析明确并理解递推公式
第三步,理解dp数组如何初始化
第四步,理解遍历顺序
代码
题目描述
这是动态规划解决子序列问题的例子。
第一步,明确并理解dp数组及下标的含义
int n = nums.size();
//nums[0,i]表示从第0个数一直到第i个数(包含第i个数)的子数组,dp[i]表示子数组nums[0,i]中的最长严格递增子序列的长度。
vector<int> dp(n,1);//所有的dp[i]都初始化为1,含义是nums[i]这一个数自身一定是一个子序列
第二步,分析明确并理解递推公式
给定i,需要对对所有0<=j<i的nums[j]逐个考察
if(nums[i] > nums[j]){
dp[i] = max(dp[j]+1,dp[i]);
}
第三步,理解dp数组如何初始化
vector<int> dp(n,1);//所有的dp[i]都初始化为1,含义是nums[i]这一个数自身一定是一个子序列
第四步,理解遍历顺序
i的遍历顺序应该从小到大。起止范围是[0,n-1]。
j的遍历顺序从小到大或者从大到小都可以,起止范围是[0,i-1]。
代码
class Solution {
public:int lengthOfLIS(vector<int>& nums) {int n = nums.size();//nums[0,i]表示从第0个数一直到第i个数(包含第i个数)的子数组,dp[i]表示子数组nums[0,i]中的最长严格递增子序列的长度。vector<int> dp(n,1);//所有的dp[i]都初始化为1,含义是nums[i]这一个数自身一定是一个子序列int maxLen = dp[0];for(int i = 1;i < n;i++){for(int j = 0;j < i;j++){if(nums[i] > nums[j]){dp[i] = max(dp[j]+1,dp[i]);}}if(dp[i] > maxLen)maxLen = dp[i];}return maxLen;}
};