{{{ #!cplusplus {{{ #!cplusplus /* zju1108,hdu1160 FatMouse's Speed:严格递增子列 ymc 2008/10/10 题目大意: 给定n只老鼠,每只老鼠有体重和速度,求老鼠的一个最长序列, 使得体重严格递增,速度严格递减。给出这个序列的长度,并且输出这个序列中 的每只老鼠在输入中的序号。 分析与解题思路: 先对所有老鼠排序,第一个关键字体重从小到大,第二关键字速度从大到小。 然后求这个序列中的最长严格递增子序列。 算法参考:严格递增子序列 b[i]记录以i只老鼠作为结尾的最长合法序列的长度,则有状态转移方程 b[i]=max{b[j]+1},0<=j #include using namespace std; const int N=1010; struct Mice { int w; //体重 int s; //速度 int id;//因为输出需要序号,这里记录序号 }; int n; Mice a[N]; int b[N]; //以i只老鼠作为结尾的最长合法序列的长度 int c[N];//以第i只老鼠作为结尾的最长合法序列的倒数第二只老鼠的序号 int len; int d[N]; bool Cmp(const Mice &b,const Mice &c) { return (b.wc.s); } void DP() { sort(a,a+n,Cmp); b[0]=1; c[0]=-1; for(int i=1;ia[i].s&&b[j]+1>b[i]) { b[i]=b[j]+1; c[i]=j; } } } int max=n-1; for(int j=n-1;j>=0;j--)//最长的序列长度,以及最后一直老鼠的序号 if(b[j]>b[max]) max=j; int j=max; len=b[max]; while(c[j]!=-1) //输出序列,写的有点乱。 { d[--len]=a[j].id; j=c[j]; } d[0]=a[j].id; cout<>weight) { cin>>speed; a[id].w=weight; a[id].s=speed; a[id].id=id+1; id++; } n=id; DP(); //system("pause"); } }}}