欢迎来到PJCK的博客

(DP LIS) leetcode 646. Maximum Length of Pair Chain

You are given n pairs of numbers. In every pair, the first number is always smaller than the second number.

Now, we define a pair (c, d) can follow another pair (a, b) if and only if b < c. Chain of pairs can be formed in this fashion.

Given a set of pairs, find the length longest chain which can be formed. You needn't use up all the given pairs. You can select pairs in any order.

Example 1:

Input: [[1,2], [2,3], [3,4]]
Output: 2
Explanation: The longest chain is [1,2] -> [3,4]

 

Note:

  1. The number of given pairs will be in the range [1, 1000].

========================================================

这个题与LIS比较相似的,在a 和 b两个数组中,我们可以只需要比较a[1]和b[0]之间的大小就行,注意要先进行排序,以子数组下标为0的标准进行排序。其他就和LIS的解法就一样了。

C++代码:

inline bool cmp(const vector<int> &a, const vector<int> &b){
    return a[0] < b[0];
}
class Solution {
public:
    int findLongestChain(vector<vector<int>>& pairs) {
        sort(pairs.begin(),pairs.end(),cmp);
        if(pairs.size() == 0) return 0;
        int n = pairs.size();
        vector<int> dp(n,1);
        int res = 1;
        for(int i = 1; i < n; i++){
            for(int j = 0; j < i; j++){
                if(pairs[i][0] > pairs[j][1] && dp[i] < dp[j] + 1)
                    dp[i] = dp[j] + 1;
            }
            res = max(res,dp[i]);
        }
        return res;
    }
};

 

posted @ 2019-05-10 21:15  PJCK  阅读(26)  评论(0编辑  收藏