标签:
经典矩形嵌套问题,先排序再求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或者是逆向建图记忆花搜索来求解。
标签:
原文地址:http://www.cnblogs.com/huoxiayu/p/4649297.html