标签:
Description
Input
Output
Sample Input
6008 1300 6000 2100 500 2000 1000 4000 1100 3000 6000 2000 8000 1400 6000 1200 2000 1900
Sample Output
4 4 5 9 7
按照体重递增 速度递减的方式排序 然后找到最大的串 主要是路径问题
#include<cstdio> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> #include<cstring> #include<vector> using namespace std; #define maxn 10005 #define N 3000 int dp[N],p[N],a[N]; struct node { int w,s,t; }q[N]; int cmp(node e,node f) { if(e.w!=f.w) return e.w<f.w; return e.s>f.s; } int main() { int n=1; while(scanf("%d%d",&q[n].w,&q[n].s)!=EOF) { q[n].t=n; dp[n]=1; p[n]=0; n++; } n=n-1; sort(q+1,q+1+n,cmp); int maxx=-12365478,m; for(int i=1;i<=n;i++) { for(int j=1;j<i;j++) { if(q[i].w>q[j].w&&q[i].s<q[j].s&&dp[i]<=dp[j])///dp[j]>=dp[i] 即dp[i]=dp[j]+1存进去才有意义 { dp[i]=dp[j]+1; p[i]=j;///p[i]=j保留上一个的位置 方便依次查找 if(dp[i]>=maxx) { maxx=dp[i]; m=i;///保留最大值的位置 } } } } int x=m,i=0; while(x) { a[i++]=x;///提取到数组 x=p[x];///依次查找 } printf("%d\n",i); while(i>0) { i--; printf("%d\n",q[a[i]].t);///输出 } return 0; }
标签:
原文地址:http://www.cnblogs.com/a719525932/p/5764152.html