友好城市
题目描述
核心思路
- 条件一:每个城市只能建立一座桥
- 条件二:所有的桥与桥之间不能相交
- 目标:最多能建立多少座桥
步骤:
- 通过排序,固定自变量的顺序,是给自变量排序哦,不是给因变量排序。
- 给自变量排好序之后,找因变量的最大上升子序列。
如下图所示,图中绿色四条就是我们可以建桥的,最多四座桥。我们发现,当把自变量排好序之后,不相交的桥都有个特征:因变量都是在单调上升。前提是我们已经把自变量排好序固定了。
因此,其实这题求最多的建桥数目,等价于求最大的最长上升子序列。
代码
#include<iostream>
#include<algorithm>
using namespace std;
typedef pair<int,int>PII;
const int N=5010;
int n;
PII q[N];
int dp[N];
int main()
{
scanf("%d",&n);//n个城市
//南岸和北岸的一对友好城市的坐标。
for(int i=1;i<=n;i++)
scanf("%d%d",&q[i].first,&q[i].second);
//给自变量排序
sort(q+1,q+n+1);
int ans=0;//政府所能批准的最多申请数。
//做一遍LIS
for(int i=1;i<=n;i++)
{
dp[i]=1;
for(int j=1;j<i;j++)
{
if(q[j].second<q[i].second)
dp[i]=max(dp[i],dp[j]+1);
}
ans=max(ans,dp[i]);//找出所有以a[i]结尾的上升子序列中的最大值
}
printf("%d\n",ans);
return 0;
}