渡轮问题
Description
Palmia河在某国从东向西流,并把该国分成南北两个部份。河的两岸共有n个城市,且北岸的某个城市与南岸的某个城市是友好城市,而且对应的关系是一一对应。如下图:
现要求在两个友好城市之间建立一条航线,但由于天气关系,所有的航线都不能相交,因此就可能所有城市都建立航线。如上图,则最多可建立两条航线可保证航线不交叉。
Input
第一行为一个数n(n<=5000),表示城市的个数。第二行为n个数,表示南边n个城市离河的源头的距离(小于2^31-1)。第三行为n个数,表示北边n个城市离河的源头的距离(<2^31-1),距离为整数。
Output
一个数,能建立最多的航线。
Sample Input
5 //表示友好城市的对数
1 2 3 4 5
3 2 1 5 4
Sample Output
2
分析:
对第一组排序
然后算第二组的最长不下降子序列
code:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int f[1000];
struct node{
int x,y;
}a[1000];
bool cmp(node a,node b)
{
return a.x<b.x;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i].x);
for(int j=1;j<=n;j++)
scanf("%d",&a[j].y);
sort(a+1,a+1+n,cmp);
f[n]=1;
for(int i=n-1;i>=1;i--)
{
f[i]=1;int max=0;
for(int j=i+1;j<=n;j++)
if(a[i].y<a[j].y&&f[j]>max)max=f[j];
f[i]=max+1;
}
int ans=0;
for(int i=1;i<=n;i++)
if(ans<f[i])ans=f[i];
printf("%d",ans);
}