leetcode646最长数对链
题目描述:给出 n 个数对。 在每一个数对中,第一个数字总是比第二个数字小。现在,我们定义一种跟随关系,当且仅当 b < c 时,数对(c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。给定一个数对集合,找出能够形成的最长数对链的长度。你不需要用到所有的数对,你可以以任何顺序选择其中的一些数对来构造。
解题:
明显这是一个最长递增子序列问题
定义状态:
dp[i] 代表第i位置的最长数对链的长度
状态转移:
dp[i] = max{dp[j] + 1}
边界条件:
dp[i] = 1;
编码:
int findLongestChain(vector<vector<int>>& pairs) {
int n = pairs.size();
vector<int> dp(n + 1, 1);
sort(pairs.begin(), pairs.end());
int ans = 1;
for (int i = 1; i < pairs.size(); i++) {
for (int j = 0; j < i; j++) {
if (pairs[i][0] > pairs[j][1]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
ans = max(ans, dp[i]);
}
return ans;
}