求连续递增子序列(入门级别dp)
与最长递增子序列的共同点在于:
答案在任意子序列中,只是这个是在连续子序列中。
DP[i]的意义相同,都是表示以nums[i]为结尾的最长~
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
if(nums.size()==0)
return 0;
int pre = 1;
int cur ;
int res = 1;
for(int i =1;i<nums.size();i++){
if(nums[i]>nums[i-1])
cur = pre+1;
else
cur = 1;
pre = cur;
res = max(res,cur);
}
return res;
}
};
求最长递增子序列(进阶)
这个DP解效率极其低下。。大家懂了后可以看看其他方法。当然还让我懂得了C++中快速求数组中最大值的方法,可看后面两段代码的效率对比图。
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
if(nums.empty())
return 0;
vector<int>dp(nums.size(),1);
int res = 1;
//要清楚这种动态规划中dp[i]所代表的是扫描含义,比如这题dp[i]代表的应该是以nums[i]结尾的最长递增子序列。
for(int i=1;i<nums.size();i++){
//搜寻前面比它小的序列结果,而后拼接上去。
for(int j=i-1;j>=0;j--){
if(nums[i]>nums[j])
dp[i]=max(dp[j]+1,dp[i]);
res = max(dp[i],res);
}
}
//注意这种某某求最长的DP一般都不清楚最后求出的最长子序列在哪个(n)中
return res;
}
};
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int>dp(nums.size(),1);
for(int i=1;i<nums.size();i++){
for(int j=i-1;j>=0;j--){
if(nums[i]>nums[j])
dp[i]=max(dp[j]+1,dp[i]);
}
}
//注意这种某某求最长的DP一般都不清楚最后求出的最长子序列在哪个(n)中
return *max_element(dp.begin(),dp.end());
}
};