【动规初步】轮船问题

题目描述
有一个国家被一条河划分为南北两部分,在南岸和北岸总共有N个城镇,每一城镇在对岸都有唯一的友好城镇.任何两个城镇都没有相同的友好城镇.每一对友好城镇都希望有一条航线来往.于是他们向政府提出了申请.由于河中年有雾,政府决定不允许有任何两条航线交叉(如果两条航线交叉,将有很大机会撞船). 
你的任务是编写一个程序来帮助官员决定他们应拨款兴建哪些航线以使得没有出现交叉得航线最多.
输入
第一行两个由空格分隔的整数x,y, 10<=x<=10000, 10<=y<=90000. x表示河的长度而y表示宽. 第二行是一个整数N(1<=N<=5000),表示分布在河两岸的城镇对数. 接下来的N行每行有两个空格分隔的正数C,D(0《C,D《=x),描述每一对友好城镇沿着河岸与西边境线的距离,C表示北岸城镇的距离而D表示南岸城镇的距离. 在河得同一边,任何两个城镇的位置都是不同的.
输出
给出每一组数据在安全条件下能够开通的最大航线数目. 
样例输入
30  4 
7
22  4
2   6
10  3
15  12
9   8
17  17
4   2


样例输出
4

 

思路:

 

 实现代码:

#include<bits/stdc++.h>
using namespace std;
const int inf = -1;
int x,y,n;
int f[5002];
struct city
{
    int c,d;
}fc[5002];
bool cmp(const struct city a,const struct city b)
{
    return a.c < b.c ||(a.c == b.c && a.d < b.d);
}
int main()
{
    cin >> x >> y;
    cin >> n;
    int i,j;
    for(i = 0;i < n;i++)
    {
        cin >> fc[i].c >> fc[i].d;
    }
    sort(fc,fc+n,cmp);
    for(i = 0;i < n;i++)
    f[i] = 1;

    for(i = 0;i < n; i++)
        for(j = 0;j < i;j++)
        {
            if(fc[i].c > fc[j].c && fc[i].d > fc[j].d && f[i] < f[j] + 1)
            f[i] = f[j] + 1;
        }
    int ans;
    for(i = 0 ;i < n;i++)
    ans = max(ans,f[i]);
    cout << ans;
    return 0;
}

 

posted @ 2018-10-31 11:10  LizLiz  阅读(255)  评论(0)    收藏  举报