HDU-1160-FatMouse's Speed

 

分析:

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 }

 

posted @ 2018-07-24 21:28  kpole  阅读(123)  评论(0编辑  收藏  举报