题目链接:300. 最长递增子序列
题目描述
解法
动态规划五部曲
- 确定dp数组(dp table)以及下标的含义
dp[i]:下标i之前包括nums[i]为结尾的最长递增子序列为dp[i] - 确定递推公式
位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。所以:if (nums[i] > nums[j]) dp[i] = max(dp[i], dp[j] + 1);
- dp数组如何初始化
元素始化为1 - 确定遍历顺序
从前向后遍历 - 举例推导dp数组
代码
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> dp(nums.size(),1);
if(nums.size()<=1)
return 1;
int res = 0;
for(int i= 1;i<nums.size(); i++)
{
for(int j=0; j<i;j++)
{
if(nums[i]> nums[j]) // i>j
dp[i]= max(dp[i], dp[j]+1);
}
res = max(res,dp[i]);
}
return res;
}
};