【动态规划】友好城市

第二天叫醒我的不是闹钟,是梦想!

题目描述
一条河从东向西流过,并把魔法世界分为南北两个部分。河的两岸各有n个城市,且北岸的每一个城市都与南岸的某个城市是友好城市,而且对应的关系是一一对应的,如图所示。

现在要求在两个友好城市之间建立一条航线,但为了安全起见,所有航线都不能相交,因此,不是所有的友好城市都能建立航线。请问,最多能建多少航线?
输入
第一行两个由空格分隔的整数x,y,10≤x≤6000,10≤y≤100。x表示河的长度而y表示宽,第二行是一个整数n(1≤n≤5000),表示分布在河两岸的城市对数。接下来的n行每行有两个由空格分隔的正数c,d(c,d≤x),描述每一对友好城市与河起点的距离, c表示北岸城市的距离,而d表示南岸城市的距离。在河的同一边,任何两个城市的位置都是不同的。
输出
在安全条件下能够开通的最大航线数目。
样例输入 Copy
30 4
5
4 5
2 4
5 2
1 3
3 1
样例输出 Copy
3

需要先排序,然后求一下最长上升子序列

#include<bits/stdc++.h>
using namespace  std;
const int N=6e4+10;
typedef pair<int,int> PII;
PII a[N];
int dp[N];
int x,y,n;
int main()
{
  cin>>x>>y>>n;
  for(int i=1;i<=n;i++) cin>>a[i].first>>a[i].second;
  sort(a+1,a+1+n);
  int res=0;
  for(int i=1;i<=n;i++)
  {
    dp[i]=1;
    for(int j=1;j<i;j++)
      if(a[i].second>a[j].second)
        dp[i]=max(dp[i],dp[j]+1);
    res=max(res,dp[i]);
  }
  cout<<res<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值