题目:有人认为大象的体重和智力有一定的正相关性,现在给你一些数据,找到一个最长的反例序列。
分析:dp,LIS,醉倒上升子序列。对W排序求出S的最大下降子序列即可,存储路径前驱,dfs输出。
说明:先读到EOF再处理。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
typedef struct enode
{
int id,w,s;
}elephant;
elephant E[1001];
int cmp(elephant a, elephant b)
{
if (a.w == b.w) {
if (a.s == b.s)
return a.id < b.id;
else return a.s > b.s;
}else return a.w < b.w;
}
int F[1001],P[1001];
void output(int s,int d)
{
if (P[s] == s) {
printf("%d\n%d\n",d,E[s].id);
return;
}else {
output(P[s], d+1);
printf("%d\n",E[s].id);
}
}
int main()
{
int count = 0;
while (~scanf("%d%d",&E[count].w,&E[count].s)) {
E[count].id = count+1;
count ++;
}
sort(E, E+count, cmp);
int spa = 0;
for (int i = 0 ; i < count ; ++ i) {
F[i] = 1;
P[i] = i;
for (int j = 0 ; j < i ; ++ j)
if (E[i].w > E[j].w && E[i].s < E[j].s && F[i] < F[j]+1) {
F[i] = F[j]+1;
P[i] = j;
}
if (F[spa] < F[i]) spa = i;
}
output(spa, 1);
return 0;
}