【300.最长递增子序列】
这个 题目里面dp数组的定义比较好理解。就是第i个元素有多少个最长递增子序列。
比较难理解的是dp数组的递推公式。
原理是,将i之前的元素逐个和nums[i]进行比较,如果nums[i]大于nums[j]那么就意味着可以更新dp[i]的值,更新dp[i]的条件是dp[j]+1大于dp[i]。
下面我们可以写出代码:
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.size() <= 1)return nums.size();
int res = 0;
vector<int>dp(nums.size(), 1);
for(int i = 1; i < nums.size(); i++){
for(int j = 0; j < i; j++){
if(nums[i] > nums[j])dp[i] = max(dp[i],dp[j]+1);
}
if(dp[i] > res)res = dp[i];
}
return res;
}
};
注意:结果是取所有dp[i]中最大的值,所以res要每次遍历之后都更新。
【