分析:
1. 先对w排序,然后求最长子序列。要记录原来的位置,所以结构体定义一个n来记录原来的位置。
2. 我们要找出这个最长子序列的长度,并且还要输出他,就需要一个数组来记录当前块所在的子序列中的后继序号。
3. 如果从前往后找,前面的后继序号多次更新,不方便,从后往前找,只需要更新当前块。
1 #include <bits/stdc++.h> 2 #include<vector> 3 using namespace std; 4 5 struct node 6 { 7 int W; 8 int S; 9 int n; 10 }; 11 bool cmp(node a,node b) 12 { 13 14 return a.W<b.W; 15 } 16 int dp[1100]; 17 int p[1100]; 18 struct node v[1100]; 19 int main() 20 { 21 int n = 1,ans; 22 while(scanf("%d%d",&v[n].W,&v[n].S)!=EOF) 23 { 24 v[n].n = n; 25 dp[n] = 1; 26 n++; 27 } 28 ans = n; 29 memset(p,0,sizeof p); 30 dp[ans] = 0; 31 sort(v+1,v+n,cmp); 32 33 for(int i= n-1;i>=1;i--) 34 { 35 for(int j = n-1;j>i;j--) 36 { 37 if(v[j].W>v[i].W&&v[j].S<v[i].S) 38 { 39 if(dp[i]<dp[j]+1) 40 { 41 dp[i] = dp[j]+1; 42 p[i] = j; 43 if(dp[ans]<dp[i]) 44 ans = i; 45 } 46 } 47 } 48 } 49 for(int i=1;i< n;i++) 50 { 51 if(dp[i]>=1&&dp[ans]<dp[i]) 52 ans = i; 53 } 54 cout<<dp[ans]<<endl; 55 while(ans!=0) 56 { 57 cout<<v[ans].n<<endl; 58 ans = p[ans]; 59 } 60 return 0; 61 }