AcWing 1012. 友好城市(线性DP)
题目链接
题目描述
Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。
北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。
每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。
编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。
题目模型
- 最长上升子序列
题目思路
- 用结构体存储每一对关系,当结构体内只有两个元素时可以用pair
- 首先按照自变量对应元素大小进行结构体排序
- 排序之后只要计算出因变量的最长上升子序列大小即可,因为若因变量出现一个逆序时,即出现交叉情况
题目代码
#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;
}