思路:

  1. 首先按照A升序排序,如果A相等,则按照B降序排序,这样可以保证对于每一对<Ai, Bj>,Ai > Bj。
  2. 然后从排序后的数对中找出最长的递增序列。
  3. 输出递增序列的长度即为极大值K。

C++实现:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool compare(pair<int, int> p1, pair<int, int> p2) {
    if (p1.first == p2.first)
        return p1.second > p2.second; // 如果A相等,则按照B降序排序
    else
        return p1.first < p2.first; // 按照A升序排序
}

int main() {
    int N;
    cin >> N;
    vector<pair<int, int>> nums(N);
    for (int i = 0; i < N; i++) {
        cin >> nums[i].first >> nums[i].second;
    }
    sort(nums.begin(), nums.end(), compare); // 排序
    vector<int> dp(N, 1); // dp[i]表示以第i个数对结尾的最长递增序列的长度
    int maxLen = 1; // 最长递增序列的长度
    for (int i = 1; i < N; i++) {
        for (int j = 0; j < i; j++) {
            if (nums[i].second > nums[j].second) {
                dp[i] = max(dp[i], dp[j] + 1);
            }
        }
        maxLen = max(maxLen, dp[i]);
    }
    cout << maxLen << endl;
    return 0;
}
``

原文地址: https://www.cveoy.top/t/topic/iShZ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录