题意:n只老鼠,给出每只老鼠的weight和speed,求一排weight严格增加,speed严格递减的最长老鼠串。
根据weight排序一下,然后就是一道最长不上升子序列的题。
#include <iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1100
using namespace std;
struct node
{
int w,s,i;
}m[N];
int d[N],pre[N];
bool cmp(node a,node b)
{
return a.w<b.w;
}
int main()
{
int cnt=0,ans;
while(~scanf("%d%d",&m[cnt].w,&m[cnt].s)) d[++cnt]=1,m[cnt].i=cnt+1;
d[ans=cnt]=0;
sort(m,m+cnt,cmp);
memset(pre,-1,sizeof(pre));
for(int i=cnt-1;i>=0;i--)
{
for(int j=cnt-1;j>i;j--)
{
if(m[i].w<m[j].w&&m[i].s>m[j].s&&d[j]+1>d[i])
{
d[i]=d[j]+1;
pre[i]=j;
if(d[ans]<d[i]) ans=i;
}
}
}
cout<<d[ans]<<endl;
while(ans!=-1)
{
cout<<m[ans].i<<endl;
ans=pre[ans];
}
}