题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1160
题意就是给你一些老鼠(编号1,2,3,4,5,6,7,8...)的体重和他们的速度然后求出最大的n满足
W[m[1]] < W[m[2]] < ... < W[m[n]]
and
S[m[1]] > S[m[2]] > ... > S[m[n]]
然后把原来的编号按照上面的序列输出来;
先把他们排序一下dp的时候记录一下路径;
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> using namespace std; #define N 1550 #define INF 0xffffff struct node { int w, s, id; }a[N]; int cmp(node p, node q) { if(p.w!=q.w) return p.w<q.w; return p.s>q.s; } int main() { int n=0, dp[N], pre[N]; ///freopen("in.txt", "r", stdin); while(scanf("%d%d", &a[n].w, &a[n].s)!=EOF) { a[n].id=n+1; n++; } sort(a, a+n, cmp); memset(dp, 0, sizeof(dp)); memset(pre, -1, sizeof(pre)); int Max = 0; int Index = -1; for(int i=0; i<n; i++) { dp[i]=1; for(int j=0; j<i; j++) { if(a[j].w<a[i].w && a[j].s>a[i].s) { if(dp[j]+1>dp[i]) { dp[i]=dp[j]+1; pre[i]=j; } } } if(Max<dp[i]) { Max = dp[i]; Index = i; } } printf("%d ", Max); int b[N]={0},k=0; for(int i=Index; i!=-1; i=pre[i]) { b[k++]=a[i].id; } for(int i=k-1; i>=0; i--) printf("%d ", b[i]); return 0; }