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 }

 

你可能感兴趣的:(结构体)