nyoj 16 最长上升子序列变形

经典矩形嵌套问题,先排序再求LIS。

需要注意在枚举j的时候x和y都要小于i才行。

 1 #include <algorithm>
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 const int N = 1000;
 6 int dp[N];
 7 
 8 struct Node
 9 {
10     int x, y;
11     bool operator < ( const Node & o ) const
12     {
13         if ( x != o.x ) return x < o.x;
14         return y < o.y;
15     }
16 } node[N];
17 
18 int main ()
19 {
20     int t;
21     scanf("%d", &t);
22     while ( t-- )
23     {
24         int n;
25         scanf("%d", &n);
26         for ( int i = 0; i < n; i++ )
27         {
28             scanf("%d%d", &node[i].x, &node[i].y);
29             if ( node[i].x > node[i].y )
30             {
31                 swap( node[i].x, node[i].y );
32             }
33         }
34         sort( node, node + n );
35         int ans = -1;
36         for ( int i = 0; i < n; i++ )
37         {
38             dp[i] = 1;
39             for ( int j = 0; j < i; j++ )
40             {
41                 if ( node[j].x < node[i].x && node[j].y < node[i].y )
42                 {
43                     dp[i] = max( dp[i], dp[j] + 1 );
44                 }
45             }
46             ans = max( ans, dp[i] );
47         }
48         printf("%d\n", ans);
49     }
50     return 0;
51 }

也可以根据矩形的嵌套关系建图,然后用拓扑排序+dp或者是逆向建图记忆花搜索来求解。

posted @ 2015-07-15 19:18  hxy_has_been_used  阅读(122)  评论(0编辑  收藏  举报