#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
#define max(a,b) a>b?a:b;
typedef struct {
int w;
int h;
int n;
}size;
int main()
{
int n, w, h, s;
scanf("%d%d%d", &n, &w, &h);
int i, j;
size let[5005] = { 0 };
size t;
for (i = 1,j = 0; i <= n; i++)
{
int w0, h0;
scanf("%d%d", &w0, &h0);
if (w0 > w && h0 > h)
{
j++;
let[j].w = w0;
let[j].h = h0;
let[j].n = i;
}
}
if (!j)
{
putchar('0');
return 0;
}
n = j;
for (i = 1; i <= n - 1; i++)
{
int p = i;
for (j = i; j <= n; j++)
{
if (let[j].w < let[p].w)
p = j;
}
if (p != i)
{
t = let[p];
let[p] = let[i];
let[i] = t;
}
}
int dp[5005] = { 0 };
for (i = 1; i <= n; i++)
{
dp[i] = 1;
}
int m = 1;
for (i = 2; i <= n; i++)
{
for (j = 1; j < i; j++)
{
if (let[i].h > let[j].h && let[i].w>let[j].w)
{
dp[i] = max(dp[i], dp[j] + 1);
m = max(dp[i], m);
}
}
}
size ans[5005] = { 0 };
printf("%d\n", m);
int p = m - 1;
for (i = n; i > 0; i--)
{
if (dp[i] == m && ans[m].n == 0)
{
ans[m] = let[i];
}
if (dp[i] == p && let[i].w < ans[p + 1].w && let[i].h < ans[p+1].h)
{
ans[p] = let[i];
p--;
}
}
for (i = 1; i <= m; i++)
{
printf("%d ", ans[i].n);
}
}
分享一下自己用c语言的解法