https://vjudge.net/contest/68966#problem/J
#include<map> #include<set> #include<list> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long using namespace std; const int N=1005,inf=0x3f3f3f; struct edge{ int w,v;//w重量,v速度 int in;//记录位置 }e[N]; int pre[N]; void print(int x) { if(x!=-1)print(pre[x]); else return ; printf("%d ",x+1); } bool comp(const edge &a,const edge &b) { if(a.w!=b.w)return a.w<b.w; return a.v>b.v; } int main() { int a,b,cnt=0,dp[N]; while(scanf("%d%d",&a,&b)!=EOF){ e[cnt].w=a; e[cnt].v=b; e[cnt].in=cnt; cnt++; } sort(e,e+cnt,comp); memset(pre,-1,sizeof(pre)); int ans=0,index=0; for(int i=0;i<cnt;i++) { dp[i]=1; for(int j=0;j<i;j++) { if(e[i].w>e[j].w&&e[i].v<e[j].v) if(dp[i]<dp[j]+1) { dp[i]=dp[j]+1; pre[e[i].in]=e[j].in; } } if(ans<dp[i]) { ans=dp[i]; index=e[i].in; } } printf("%d ",ans); print(index); return 0; }
输出技巧很重要,也可以使用栈来保存后输出。
刚开始做就是没想到要排序