购物网站多少钱,公众号怎么推广,设计一个简单的广告,wordpress二维码用户登录注意事项#xff1a; 本题为线性dp—最长上升子序列的长度的扩展题#xff0c;所以dp思路这里就不再赘述。
题目#xff1a; Palmia国有一条横贯东西的大河#xff0c;河有笔直的南北两岸#xff0c;岸上各有位置各不相同的N个城市。 北岸的每个城市有且仅有…注意事项 本题为线性dp—最长上升子序列的长度的扩展题所以dp思路这里就不再赘述。
题目 Palmia国有一条横贯东西的大河河有笔直的南北两岸岸上各有位置各不相同的N个城市。 北岸的每个城市有且仅有一个友好城市在南岸而且不同城市的友好城市不相同。 每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市但是由于河上雾太大政府决定避免任意两条航道交叉以避免事故。 编程帮助政府做出一些批准和拒绝申请的决定使得在保证任意两条航线不相交的情况下被批准的申请尽量多。
输入格式 第1行一个整数N表示城市数。 第2行到第n1行每行两个整数中间用1个空格隔开分别表示南岸和北岸的一对友好城市的坐标。
输出格式 仅一行输出一个整数表示政府所能批准的最多申请数。
数据范围 1≤N≤5000, 0≤xi≤10000
输入:
7
22 4
2 6
10 3
15 12
9 8
17 17
4 2输出
4#include cmath
#include cstring
#include iostream
#include algorithm
using namespace std;const int N 5010;
pairint, int w[N];
int f[N];
int n;//最长上升子序列模板返回长度
int lis() {int res 0;for (int i 1; in; i) {f[i] 1;for (int j 1; ji; j) {if (w[j].second w[i].second) f[i] max(f[i], f[j] 1);}res max(res, f[i]);}return res;
}int main()
{//读入cin n;for (int i 1; in; i) cin w[i].first w[i].second;//pair的排序默认就是按照第一个元素的大小由小到大我这里写出来是复习一下, 大家直接sort(w1, wn1)即可sort(w1, wn1, [](auto a, auto b){return a.first b.first;});cout lis();return 0;
}思路 这道题的代码很简单难点在于对于题目思路的转换
首先分析重点: 1.每个城市只能建一座桥 2.桥与桥不能相交 目标问最多能建多少座桥
可以画出这样一个图 图中的圆圈就是城市每个城市在对岸都有其对应的友好城市以绿线连接。
到这里就能看出一个重要性质了将某一侧的城市位置进行排序后 在对岸的友好城市位置的最长上升子序列的长度 即为 桥最多能建立的数量。
这个性质是需要一些纯经验或者看脑袋的开窍程度才能在一定时间内想明白的莫办法多练吧呜呜呜
声明 算法思路来源为y总详细请见https://www.acwing.com/ 本文仅用作学习记录和交流