题目链接:点击打开链接
题意:找到一种最长序列,满足老鼠的体重严格递增,速度严格递减。输出其中一种路径即可。
排序之后按LIS做就行。
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e3+10;
const int INF=0x3f3f3f3f;
typedef struct mice
{
int index;
int w,v;
} mice;
mice a[maxn];
int out[maxn],d[maxn];
bool cmp(mice xx,mice yy)
{
if(xx.w!=yy.w)return xx.w>yy.w;
if(xx.v!=yy.v)return xx.v<yy.w;
return xx.index<yy.index;
}
void print_ans(int i)
{
printf("%d\n",a[i].index);
if(!out[i])return ;
print_ans(out[i]);
}
int main()
{
int l=1;
int i,j;
int Max=-INF,pos;
while(~scanf("%d %d",&a[l].w,&a[l].v))
{
a[l].index=l;
l++;
}
memset(d,0,sizeof(d));
memset(out,0,sizeof(out));
sort(a+1,a+l+1,cmp);
for(i=1; i<=l; i++)d[i]=1;
for(i=1; i<=l; i++)
{
for(j=1; j<i; j++)
{
if(a[i].v>a[j].v&&a[i].w<a[j].w)
{
if(d[i]<d[j]+1)
{
d[i]=d[j]+1;
out[i]=j;
}
}
}
if(Max<d[i]){Max=d[i],pos=i;}
}
printf("%d\n",Max);
print_ans(pos);
return 0;
}