动态规划(最长不下降子序列)

渡轮问题

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);
}

猜你喜欢

转载自blog.csdn.net/k42946/article/details/80889434