zoj1076 Gene Assembly

这道和zoj1025一样,本质是贪心算法,首先要求任意最长的序列,我们只要保证最长就行,也就是在一幅图中找一个最长的链,首先我们需要根据y排序(输入为x,y),因为y大的肯定在y小的后面,然后就直接贪心,前面取不到后面就不可能取到那个数,证明了贪心的正确性。

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<map>
#include<iostream>
#include<cstring>
using namespace std;
int n;
struct node
{
    int x,y,r;
}a[1005];


bool cmp(node a,node b)
{
    if(a.y<b.y)
    return 1;
    return 0;
}
int ans[1006];
int res;
void dp(int xx)
{
    ans[res++]=a[xx].r;
    for(int i=xx+1;i<n;i++)
    {
        if(a[i].x>a[xx].y)
        {
           dp(i);
           break;
        }
    }
}
int main()
{
   // freopen("input.txt","r",stdin);
    while(scanf("%d",&n)==1&&n)
    {
        res=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&a[i].x,&a[i].y);
            a[i].r=i+1;
        }
        sort(a,a+n,cmp);
     // for(int i=0;i<n;i++)
    //  {
  //        printf("%d %d
",a[i].x,a[i].y);
  //    }
        dp(0);
      //  printf("%d
",res);
        for(int i=0;i<res-1;i++)
            printf("%d ",ans[i]);
        printf("%d
",ans[res-1]);
    }
}

原文地址:https://www.cnblogs.com/acliang/p/4884022.html