一道dp的题。。。。
1 //求最长下降子序列
2 #include <iostream>
3 #include<algorithm>
4 using namespace std;
5 struct node{
6 int w,s,order;//order为存入时的顺序
7 }q[1002];//存储信息
8 int f[1002];
9 int p[1002];//记录他的前一个信息
10 bool cmp(node a,node b){
11 if(a.w==b.w)
12 return a.s>b.s;
13 return a.w<b.w;//将信息按重量的大小排序
14 }
15 void prit(int a){
16 if(p[a]==a)//最大值其位置肯定是p【a】=a
17 cout<<q[a].order<<endl;
18 else{
19 prit(p[a]);
20 cout<<q[a].order<<endl;
21 }
22 }
23 int main()
24 {
25 int cnt=1;
26 while(cin>>q[cnt].w>>q[cnt].s){
27 q[cnt].order=cnt;//记录他原来的位置
28 cnt++;
29 }
30 sort(q,q+cnt,cmp);//顺序已变
31 f[1]=1;
32 p[1]=1;
33 for(int i=2;i<cnt;i++){
34 int max = 0;
35 int idx = i;
36 for(int j=1;j<i;j++){
37 if(q[j].w<q[i].w&&q[j].s>q[i].s&&f[j]>max){
38 max = f[j];
39 idx = j;
40 }
41 }
42 f[i] = max+1;
43 p[i]= idx;
44 }
45 int max = 0;
46 int idx = 0;
47 for(int i=1;i<cnt;i++){//寻找最大的值
48 if(f[i]>max){
49 max= f[i];
50 idx = i;
51 }
52 }
53 cout<<max<<endl;
54 prit(idx);//输出其序号
55 return 0;
56 }