这题是动态规划,贪心和排序。

状态表示:d[i]表示前i位的最长满足要求子序列的长度。

状态转移:当重量严格大于前一只并且速度严格大于前一只的时候更新转移数组  d[i]=max(d[i],d[j]+1);

因为不仅要求输出最长的子序列的长度,还要求输出编号,就注意推理,为了减少时间复杂度把小老鼠的体重降序排列

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int d[N],p[N],cnt=0,ans;
struct node
{
    int w,s,num;
}a[N];
bool cmp(node x,node y)
{
    return x.w<y.w;
}
int main()
{
    while(~scanf("%d%d",&a[cnt].w,&a[cnt].s))
    {
        d[++cnt]=1;
        a[cnt].num=cnt+1;
    }
    ans=cnt;
    d[ans]=0;
    sort(a,a+cnt,cmp);
    memset(p,-1,sizeof(p));
    cnt-=1;
    for(int i=cnt;i>=0;i--)
        for(int j=cnt;j>i;j--)
        {
            if(d[j]+1>d[i]&&a[i].w<a[j].w&&a[i].s>a[j].s)
            {
                p[i]=j;    d[i]=d[j]+1;
                if(d[ans]<d[i])    ans=i;
            }
        }
    printf("%d\n",d[ans]);
    while(~ans)
    {
        printf("%d\n",a[ans].num);
        ans=p[ans];
    }
    return 0;
}
01-23 06:46