第一题: 300. 最长递增子序列 - 力扣(LeetCode)
dp[i]
表示以 nums[i]
这个数结尾的最长递增子序列的长度。
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
vector<int> dp(2510,1);
int len=nums.size();
int res=1;
for(int i=0;i<len;i++){
for(int j=0;j<i;j++){
if(nums[i]>nums[j]){
dp[i]=max(dp[i],dp[j]+1);
res=max(res,dp[i]);
}
}
}
return res;
}
};
第二题:354. 俄罗斯套娃信封问题 - 力扣(LeetCode)
先对envelopes进行排序(cmp函数)
dp[i]
表示以 envelopes[i]
这个元素为结尾的最长递增子序列的长度。
但是这种写法会TLE,列在这里是因为他是最长递增子序列的一个变种。
bool cmp(vector<int>& a,vector<int>& b){
if(a[0]<b[0]){return true;}
else if(a[0]==b[0]){
if(a[1]<=b[1]){return true;}
else{return false;}
}
else{return false;}
}
class Solution {
public:
int maxEnvelopes(vector<vector<int>>& envelopes) {
/*排序*/
sort(envelopes.begin(),envelopes.end(),cmp);
int len=envelopes.size();
int res=1;
vector<int> dp(100010,1);
for(int i=0;i<len;i++){
for(int j=0;j<i;j++){
if(envelopes[i][0]>envelopes[j][0] && envelopes[i][1]>envelopes[j][1]){
dp[i]=max(dp[i],dp[j]+1);
res=max(res,dp[i]);
}
}
}
return res;
}
};