300. 最长递增子序列
作者:互联网
✅做题思路or感想
这种“最长递增子序列”是经典的动态规划的题,虽然我在看到的第一瞬间并没有反应过来用dp,可惜
dp数组含义
dp[i]
,以nums[i]
结尾的最大递增子序列的长度
推导公式
当 nums[i] > nums[j]
时: nums[i]
可以接在nums[j]
之后(此题要求严格递增),此情况下最长上升子序列长度为dp[j] + 1
;
if (nums[i] > nums[j]) {
dp[i] = max(dp[i], dp[j] + 1);
}
后面要注意dp[i] = max(dp[i], dp[i - 1] + 1)
中不是dp[i]
和dp[i - 1] + 1
,而是去取dp[i - 1] + 1
的最大值
初始化
因为最少的子序列的长度为1,所以一律初始化为1就好了
遍历顺序
从小推大,所以是正序
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
//dp[i],以nums[i]结尾的最大递增子序列的长度
vector<int>dp (nums.size(), 1);
int result = 1;
for (int i = 0; i < nums.size(); ++i) {
for(int j = 0; j < i; ++j) {
if (nums[i] > nums[j]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
result = max(result, dp[i]);
}
//这里return的不是dp[nums.size() - 1]!!!!
//这里要想dp数组的意义,dp[nums.size() - 1]是指nums[nums.size() - 1]为结尾的最长递增子序列,而不是全局的最长的递增子序列!所以这里要return全局的!
return result;
}
};
标签:nums,300,递增,int,序列,dp,size 来源: https://www.cnblogs.com/doomaa/p/16112756.html