一看两个维度,下意识要么排序再dp要么对两个分别开一维。
先sort可以保证体重上升,再跑最长上升子序列(对原来的数取相反数即可)。
#
填坑1:如果不存在合法解的话,ans也要更新,所以在枚举j前要加个if
填坑2:如果ans=1的话,调整一下回溯语句的顺序可以防止最后一个卡了没输出
填坑3:改了cmp,判断了weight相同的情况,写了return <和return >的,仍wa
----
待填
#include <iostream> #include <math.h> #include <string.h> #include <vector> #include <map> #include <queue> #include <stdio.h> #include <algorithm> #include <cstdio> using namespace std; const int maxn=5000; struct lys{ int weight,speed; }mouse[maxn]; bool cmp(lys a,lys b) { if(a.weight!=b.weight) { return a.weight<b.weight; } else { return a.speed<b.speed; } } int print[maxn],dp[maxn],fa[maxn]; int main( ){ //freopen("lys.in","r",stdin); int a,b,cnt=0; while(cin>>a>>b) { cnt++; mouse[cnt].weight=a;mouse[cnt].speed=-b; } sort(mouse+1,mouse+1+cnt,cmp); int ans=-20211006,pos; for(int i=1;i<=cnt;i++) { dp[i]=1; fa[i]=i; if(dp[i]>ans) { ans=dp[i]; pos=i; } for(int j=1;j<=i-1;j++) { if(mouse[i].speed>mouse[j].speed) { if(dp[j]+1>dp[i]) { dp[i]=max(dp[i],dp[j]+1); fa[i]=j; if(dp[i]>ans) { ans=dp[i]; pos=i; } } } } } printf("%d\n",ans); cnt=0; for(int i=pos;;) { cnt++; print[cnt]=i; if(fa[i]==i) { break; } i=fa[i]; } for(int i=cnt;i>=1;i--) { printf("%d\n",print[i]); } }