题目链接:HDU 1160
题意:
找出老鼠中最长的(体重上升并且速度下降)的下标数列。
(可以排序后查找)
分析:
先排序,按照体重递增,速度递减的排序方法。
然后按照LIS的方式寻找,判断变成
p[i].w>p[j].w&&p[i].s<p[j].s&&dp[i]<dp[j]+1
更新最长时,并且记录前一个的下标。
最后倒过来存,然后输出。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int MAX=100000+10; struct jud { int w,s,index; }p[MAX]; int dp[MAX],dex[MAX]; int cmp(const void *aa,const void *bb) { jud a=*(const jud *)aa; jud b=*(const jud *)bb; if(a.w!=b.w) return a.w-b.w; else return b.s-a.s; } int main() { int cnt=1; while(scanf("%d %d",&p[cnt].w,&p[cnt].s)!=EOF) { p[cnt].index=cnt; cnt++; } cnt--; qsort(p+1,cnt,sizeof(p[0]),cmp); for(int i=1;i<=cnt;i++) { dex[i]=i; } int in,Max=0; for(int i=1;i<=cnt;i++) { dp[i]=1; for(int j=1;j<i;j++) { if(p[i].w>p[j].w&&p[i].s<p[j].s&&dp[i]<dp[j]+1) { dp[i]=dp[j]+1; dex[p[i].index]=p[j].index; } } if(dp[i]>Max) { Max=dp[i]; in=p[i].index; } } int v=1,ans[MAX]={in}; while(dex[in]!=in) { ans[v++]=dex[in]; in=dex[in]; } printf("%d\n",Max); for(int i=v-1;i>=0;i--) { printf("%d\n",ans[i]); } return 0; }