一开始以为是LIS,再后来想到其实是DAG最长路,每一个大象都看成是一个节点,大象a和b,如果a的体重小于b,而iq大于b,则节点a到节点b有一条路径长度为1的路,只要找最长路就行了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=1001;
const int inf=1000000;
int g[maxn][maxn],d[maxn],next[maxn];
typedef struct elephant
{
int num,weight,iq;
}enode;
bool cmp(enode x,enode y)
{
if(x.weight!=y.weight) return x.weight<y.weight;
if(x.iq!=y.iq) return x.iq>y.iq;
return x.num<y.num;
}
enode node[maxn];
int main()
{
// freopen("in.txt","r",stdin);
int n=1;
while(scanf("%d%d",&node[n].weight,&node[n].iq)!=EOF)
{
node[n].num=n;//记录没有排序前的真实大象序列号
n++;
}
n--;
sort(node+1,node+n+1,cmp);//按体重递增,iq递减排序
memset(g,0,sizeof(g));
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
if((node[i].weight<node[j].weight)&&(node[i].iq>node[j].iq))
g[i][j]=1;
for(int i=1;i<=n;i++)
d[i]=1;//一个大象本身自己的长度为1
memset(next,-1,sizeof(next));
for(int i=n;i>=1;i--)
for(int j=i+1;j<=n;j++)
if(g[i][j])
{
if(d[i]<d[j]+1)
{
d[i]=d[j]+1;
next[i]=j;//记录大象i的下一个节点j,方便后面打印路径
}
}
int maxnum=0,pos=-1;
for(int i=1;i<=n;i++)
if(d[i]>maxnum)
{
pos=i;
maxnum=d[i];
}
printf("%d\n",maxnum);
for(int i=pos;i!=-1;i=next[i])
{
printf("%d\n",node[i].num);
}
return 0;
}