hdu1160 最长上升子序列

给定画上n个点,求最短的线段把所有点连起来输入一串序列:


w1 s1


w2 s2


....  ....


wn  sn


要求输出w严格递增 ,s严格递减的序列的最大长度。


并且按顺序输出下标。


#include <iostream>
#include <stdio.h>
#include <algorithm>
#define MAX 1005
using namespace std;

struct node
{
    int w,s,id;
}mouse[MAX];
int dp[MAX];
bool cmp(node a,node b)
{
    if(a.w<b.w)return 1;
    else if(a.w==b.w)
    {
        if(a.s>b.s)return 1;
    }
    else return 0;
}

int main()
{
    //freopen("in.txt","r",stdin);
    int c=0;
    while(scanf("%d%d",&mouse[c].w,&mouse[c].s)!=EOF)
    {
        mouse[c].id=c+1;
        c++;
    }
    sort(mouse,mouse+c,cmp);
    int len=0;
    for(int i=0;i<c;i++)
    {
        dp[i]=1;
        for(int j=0;j<i;j++)
        {
            if(mouse[i].s<mouse[j].s&&dp[i] < dp[j] + 1)dp[i] = dp[j] + 1;
            len=len>dp[j]?len:dp[j];
        }
    }

    int res[MAX];
    printf("%d\n",len);
    int cc=0;
    for(int i=c-1;i>=0&&len>=0;i--)
    {
        if(dp[i]==len)
        {
            res[cc]=mouse[i].id;
            cc++;
            len--;
        }

    }
    for(int i=cc-1;i>=0;i--)
    {
        printf("%d\n",res[i]);
    }
    return 0;
}


你可能感兴趣的:(hdu1160 最长上升子序列)