原题链接:https://leetcode-cn.com/problems/maximum-length-of-pair-chain/
1、动态规划
dp[i]表示第i个位置最长的数对链的长度
状态转移
dp[i]=max(dp[j]+1); j从0到i
不过题目的数对是可以乱序的,所以我们先提前给按数对第一个数来从小到大排序,然后再进行动态规划。其实根据第二种贪心算法,按第二个数来排序更好!
static bool lessVector(const vector<int>&vec1,const vector<int>&vec2){
return vec1[0]<vec2[0];
}
int findLongestChain(vector<vector<int>>& pairs) {
int m=pairs.size();
int n=pairs[0].size();
sort(pairs.begin(),pairs.end(),lessVector);
vector<int> dp(m,0);
dp[0]=1;
int max_len=INT_MIN;
for(int i=1;i<m;i++){
for(int j=0;j<i;j++){
dp[i]=max(dp[i],pairs[i][0]>pairs[j][n-1]?dp[j]+1:dp[j]);
}
max_len=max(max_len,dp[i]);
}
return max_len;
}
2、贪心算法
按数对第二个数排序,这样就可以从所有符合条件的下一个数对中找第二个数最小的数对,达到贪心的效果。
static bool lessVector(const vector<int>&vec1,const vector<int>&vec2){
return vec1[1]<vec2[1];
}
int findLongestChain(vector<vector<int>>& pairs) {
int m=pairs.size();
int n=pairs[0].size();
sort(pairs.begin(),pairs.end(),lessVector);
int cur=INT_MIN;
int count=0;
for(int i=0;i<m;i++){
if(cur<pairs[i][0]){
cur=pairs[i][1];
count++;
}
}
return count;
}
可以看出第二个数权重更大