题目链接:300. 最长递增子序列 - 力扣(LeetCode)
代码如下
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
//dp[i]是nums[i]的最大递增子序列
//dp[i] = max(dp[j] + 1, dp[i]);
int len = nums.size();
if(len <= 1) return len;
vector<int> dp(len + 1, 1);
int result = 0;
dp[0] = 1;
for(int i = 1; i < len; i++)
{
for(int j = 0; j < i; j++)
{
if(nums[i] > nums[j])
{
dp[i] = max(dp[j] + 1, dp[i]);
}
}
if(dp[i] > result)
{
result = dp[i];
}
}
return result;
}
};
这个题目其实就是去寻找一个子序列在原有的序列中找到一个递增的就好
确定dp含义:dp[i]其实也就是题目所说的我们需要去寻找一个递增的子序列,那我们就定义dp[i]为nums[i]的最大递增子序列
dp递推公式:这个就是我们画一个数轴,如果我们要去找到一个最大的,那我们定好0到i这个区间,然后再用一个j来遍历,条件就是nums[i]>nums[j],然后去推导出来公式dp[i] = max(dp[j] + 1, dp[i]),dp[j] + 1是因为我们如果想让dp[j]和dp[i]相等,那么我们只能dp[j] + 1来等于dp[i],dp[i]的意思是,就是我们与dp[i]作比较,然后取一个最大值
初始化:dp[0] = 1, 因为就一个数嘛,那么就只有一种
遍历顺序:两层for循环,第一层for是为了定义0 - i的区间,第二层for循环是在0 - i的区间里,再去用一个j去找到一个最大值
返回的参数:在定义一个result = 0,找到的dp[i]的值,去与result比较,这个时候千万不是dp[nums.size() - 1],因为很有可能最后一个并不是这个递增子序列的最后一个