题意:在老鼠体重增大的同时要使速度减少,换句话说就是在体重递增的条件下找出速度的最大下降子序列.
输入:文件以eof结束,每一行两个,第i行表面第i只老鼠的体重和速度.
输出:最优解的长度,以及路径
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
分析:先sort一下来确保质量递增,在此条件下找速度的最长下降子序列,那么现在的问题就是保存路径,由于提前想到是用结构题存储,那么路径的存储就会方便许多.
#include<iostream> #include<vector> #include<algorithm> using namespace std; int vis[1010]; int ans=1; int a,b; int flag; int q; int sum[1010]; struct node { int cnt; int m; int s; } e[1005]; bool camp(node a,node b) { if(a.m==b.m) return a.s>b.s; return a.m<b.m; } int main() { while(cin>>a>>b) { e[ans].m=a; e[ans].s=b; e[ans].cnt=ans;//因为排序后会乱,提前存好 ans++; } sort(e+1,e+ans+1,camp); for(int i=0; i<1005; i++) vis[i]=-1; for(int i=0; i<ans; i++) sum[i]=1; for(int i=1; i<=ans; i++) { for(int j=1; j<i; j++) { if(e[i].s<e[j].s) { if(e[i].m==e[j].m) continue; if(sum[i]<sum[j]+1) { sum[i]=sum[j]+1; vis[i]=j; } } } if(sum[i]>flag) { flag=sum[i]; q=i;//这里找到最后一个 } } cout<<flag<<endl; vector<int> v; v.clear(); while(q!=-1) { v.push_back(e[q].cnt); q=vis[q]; } for(int i=v.size()-1; i>=0; i--) cout<<v[i]<<endl; return 0; }