題目過於簡單,普通的O(n^2) lis 能過,不過需要注意的是,w 和 h 不能變換, 也就是說A「2,5」 和 B「6,3」,A不能嵌套B
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 5001
typedef struct _NODE {
int w, h, idx;
}NODE;
NODE card[MAXN];
int f[MAXN], pre[MAXN];
int cmp(const NODE &a, const NODE &b)
{
if( a.w == b.w ) {
return a.h < b.h;
}
return a.w < b.w;
}
void back_trace(int x)
{
if( -1 != pre[x] ) {
back_trace(pre[x]);
}
printf("%d ", card[x].idx);
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
int n, nh, nw, rst, rst_idx;
while( ~scanf("%d %d %d", &n, &nw, &nh) ) {
for(int i = 1; i <= n; i ++) {
scanf("%d %d", &card[i].w, &card[i].h);
card[i].idx = i;
}
sort(card+1, card+1+n, cmp);
rst = 0;
memset(pre, -1, sizeof(int)*(n+1));
for(int i = 1; i <= n; i ++) {
f[i] = 1;
if( card[i].h <= nh || card[i].w <= nw ) {
continue;
}
for(int j = 1; j < i; j ++) {
if( card[j].h <= nh || card[j].w <= nw ) {
continue;
}
if( card[i].h > card[j].h && card[i].w > card[j].w && f[i] < f[j]+1 ) {
f[i] = f[j]+1;
pre[i] = j;
}
}
if( rst < f[i] ) {
rst = f[i];
rst_idx = i;
}
}
if( !rst ) {
printf("0\n"); continue;
}
printf("%d\n", rst);
back_trace(rst_idx);
printf("\n");
}
return 0;
}