Dp,先将体重排序,之后就是求速度的最长递增或递减子序列了。 可以优化 #include<iostream> using namespace std; struct node { int n; int weight; int speed; }mouse[1001]; int mark[1001]; int parent[1001]; int watch[1001]; int quicksort(int i,int j) { int x=mouse[j].weight; int top=i; int k; node temp; for(k=i;k<j;k++) { if(mouse[k].weight>x) { temp=mouse[k]; mouse[k]=mouse[top]; mouse[top]=temp; top++; } } temp=mouse[j]; mouse[j]=mouse[top]; mouse[top]=temp; return top; } void sort(int i,int j) { if(j>i) { int k=quicksort(i,j); sort(i,k-1); sort(k+1,j); } } void dp(int n) { int i,j; int max,pos; memset(mark,0,sizeof(mark)); memset(parent,-1,sizeof(parent)); mark[1]=1; max=1; pos=1; for(i=1;i<=n;i++) watch[i]=mouse[i].speed; for(i=2;i<=n;i++) { for(j=i-1;j>0;j--) { if(mouse[j].speed<mouse[i].speed && mouse[j].weight>mouse[i].weight &&mark[j]>mark[i]) { mark[i]=mark[j]; parent[i]=j; } } mark[i]++; if(mark[i]>max) { max=mark[i]; pos=i; } } cout<<max<<endl; while(pos!=-1) { cout<<mouse[pos].n<<endl; pos=parent[pos]; } } int main() { int weight,speed; int i=1; while(cin>>weight>>speed) { mouse[i].weight=weight; mouse[i].speed=speed; mouse[i].n=i; i++; } sort(1,i-1); dp(i-1); return 0; }