知识点:最长有序(上升)子序列
#include <cstdio>
#include <cstdlib>
struct Mouse
{
int weight;
int speed;
int num; //记录当前老鼠排序前的序号
int last; //记录为当前dp提供更新的前一个老鼠排序后的序号
}mouse[1000];
//结构体一级排序,按weight从小到大
inline int cmp(const void *a,const void *b)
{
return ((Mouse *)a)->weight-((Mouse *)b)->weight;
}
int dp[1001];
int main()
{
int cnt=0,w,s;
while(scanf("%d%d",&w,&s)!=EOF)
{
mouse[cnt].weight=w;
mouse[cnt].speed=s;
mouse[cnt].num=cnt+1;
cnt++;
}
qsort(mouse,cnt,sizeof(Mouse),cmp);
for(int i=0;i<cnt;i++)
{
dp[i]=1;
for(int j=0;j<i;j++)
if(mouse[j].speed>mouse[i].speed&&dp[j]+1>dp[i]) //状态转移方程
{
dp[i]=dp[j]+1;
mouse[i].last=j; //last保存为当前dp提供更新的前一只老鼠的序号
}
}
int max=0;
for(int i=0;i<cnt;i++)
if(dp[max]<dp[i]) max=i;
printf("%d\n",dp[max]);
int ans[1000],i=dp[max],j=max,range=dp[max];
while(dp[max]--)
{
ans[--i]=mouse[j].num;
j=mouse[j].last; //通过last来回溯,找出最长有序子序列的成员
}
for(int i=0;i<range;i++)
printf("%d\n",ans[i]);
return 0;
}