AcWing 1012. 友好城市(线性DP)


题目链接


题目描述

Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。
北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。
每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。
编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。

题目模型

  • 最长上升子序列

题目思路

  • 用结构体存储每一对关系,当结构体内只有两个元素时可以用pair
  1. 首先按照自变量对应元素大小进行结构体排序
  2. 排序之后只要计算出因变量的最长上升子序列大小即可,因为若因变量出现一个逆序时,即出现交叉情况

题目代码

#include 
#include 
#include 

using namespace std;

typedef pair PII;

const int N = 5010;

int n;
PII q[N];
int f[N];

int main()
{
    scanf("%d", &n);
    for(int i = 0; i < n; i ++ ) scanf("%d%d", &q[i].first, &q[i].second);
    sort(q, q + n);  //pair按照first排序
    
    int res = 0;
    for(int i = 0; i < n; i ++ )
    {
        f[i] = 1;
        for(int j = 0; j < i; j ++ )
            if(q[i].second > q[j].second)
                f[i] = max(f[i], f[j] + 1);
                
        res = max(res, f[i]);
    }
    
    printf("%d\n", res);
    
    return 0;
}