UVa 10131

来源:互联网 发布:错生网络剧在线观看 编辑:程序博客网 时间:2024/06/08 09:56

/*

* 类似于最长递减子序列

*/

#include<stdio.h>

#include<string.h>
#include<algorithm>
using namespace std;
#define Max(x,y) (x>y?x:y)
#define max 1000+5
struct node{
    int w,s,c;
}a[max];
int dp[max];
int pre[max];

int cmp(node x,node y){
    if(x.w<y.w){
        return 1;
    }
    else if(x.w==y.w){
        if(x.s>y.s){
            return 1;
        }
    }
    return 0;
}

void printPath(int s){
    printf("%d\n",a[s].c);
    if(pre[s]){
        printPath(pre[s]);
    }
//    printf("%d\n",a[s].c);
}

int main(){
    int cnt;
    for(cnt=1;scanf("%d%d",&a[cnt].w,&a[cnt].s)==2;a[cnt].c=cnt,cnt++);
    sort(a+1,a+cnt,cmp);
    memset(dp,0,sizeof(dp));
    int m,mi,ans=0,mw,ms,ansi;
    for(int i=cnt-1;i>0;i--){
        m=0;mw=a[i].w;ms=a[i].s;
        for(int j=i+1;j<cnt;j++){
            if(a[j].w>mw&&a[j].s<ms&&dp[j]>m){
                m=dp[j];
                pre[i]=j;
            }
        }
        dp[i]=m+1;
        if(dp[i]>ans){
            ans=dp[i];ansi=i;
        }
    }
    printf("%d\n",ans);
    printPath(ansi);
}