动态规划
- 思路:
- 假设 dp[i] 为前 i 个元素构成的最长递增子序列的个数,包含 nums[i];
- 则 dp[i] 构成序列上一个元素 nums[j] 构成最长递增子序列 dp[j],则 dp[i] = dp[j] + 1;
- 如果动态取 j ∈ [0, i - 1],则选取其中最长递增子序列值中最大的,其值 + 1 来更新 dp[i] 的值;
cpp
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int size = (int)nums.size();
if (size == 0) {
return 0;
}
std::vector<int> dp(size, 0);
for (int i = 0; i < size; ++i) {
dp[i] = 1;
for (int j = 0; j < i; ++j) {
if (nums[j] < nums[i]) {
dp[i] = std::max(dp[i], dp[j] + 1);
}
}
}
return *std::max_element(dp.begin(), dp.end());
}
};