HOJ---10814 Wooden Sticks[线性DP-求最少不递增子序列+结构体排序]

Wooden Sticks
Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB
Total submit users: 145, Accepted users: 127
Problem 10814 : No special judgement
Problem description
There is a pile of n wooden sticks. The length and weight of each stick are known in advance. The sticks are to be processed by a woodworking machine in one by one fashion. It needs some time, called setup time, for the machine to prepare processing a stick. The setup times are associated with cleaning operations and changing tools and shapes in the machine. The setup times of the woodworking machine are given as follows:

(a) The setup time for the first wooden stick is 1 minute.
(b) Right after processing a stick of length l and weight w , the machine will need no setup time for a stick of length l' and weight w' if l<=l' and w<=w'. Otherwise, it will need 1 minute for setup.

You are to find the minimum setup time to process a given pile of n wooden sticks. For example, if you have five sticks whose pairs of length and weight are (4,9), (5,2), (2,1), (3,5), and (1,4), then the minimum setup time should be 2 minutes since there is a sequence of pairs (1,4), (3,5), (4,9), (2,1), (5,2).


Input
The input consists of T test cases. The number of test cases (T) is given in the first line of the input file. Each test case consists of two lines: The first line has an integer n , 1<=n<=5000, that represents the number of wooden sticks in the test case, and the second line contains n 2 positive integers l1, w1, l2, w2, ..., ln, wn, each of magnitude at most 10000 , where li and wi are the length and weight of the i th wooden stick, respectively. The 2n integers are delimited by one or more spaces.


Output
The output should contain the minimum setup time in minutes, one per line.


Sample Input
3
5
4 9 5 2 2 1 3 5 1 4
3
2 2 1 1 2 2
3
1 3 2 2 3 1
Sample Output
2
1
3
Problem Source
Asia 2001, Taejon (South Korea)

 

 

 

 

 

注意下当两棵树high相等的时候要对weight进行排序。

code:

 1 #include <iostream>   
 2 #include <iomanip>   
 3 #include <fstream>   
 4 #include <sstream>   
 5 #include <algorithm>   
 6 #include <string>   
 7 #include <set>   
 8 #include <utility>   
 9 #include <queue>   
10 #include <stack>   
11 #include <list>   
12 #include <vector>   
13 #include <cstdio>   
14 #include <cstdlib>   
15 #include <cstring>   
16 #include <cmath>   
17 #include <ctime>   
18 #include <ctype.h> 
19 using namespace std;
20 
21 struct Tree
22 {
23     int high,weight;
24 }tree[5005];
25 
26 int operator <(const Tree &a,const Tree &b)
27 {
28     if(a.high==b.high)
29         return a.weight>b.weight;
30     else
31         return a.high>b.high;
32 }
33 
34 int main()
35 {
36     int t;
37     int i,j;
38     int n;
39     int max;
40     int dp[5200];
41     while(~scanf("%d",&t))
42     {
43         while(t--)
44         {
45             max=-1;
46             scanf("%d",&n);
47             for(i=0;i<n;i++)
48                 scanf("%d%d",&tree[i].high,&tree[i].weight);
49             sort(tree,tree+n);
50             for(i=0;i<n;i++)
51                 dp[i]=1;
52             for(i=1;i<n;i++)
53                 for(j=i-1;j>=0;j--)
54                     if((tree[i].weight>tree[j].weight)&&dp[i]<dp[j]+1)
55                         dp[i]=dp[j]+1;
56             for(i=0;i<n;i++)
57                 if(dp[i]>max)
58                     max=dp[i];
59             printf("%d\n",max);
60         }
61     }
62     return 0;
63 }

 

posted @ 2012-07-30 13:51  max_xbw  阅读(233)  评论(0)    收藏  举报