矩形嵌套
题目描述:
有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。
输入描述:
第一行是一个正正数N(0<N<10),表示测试数据组数, 每组测试数据的第一行是一个正正数n,表示该组测试数据中含有矩形的个数(n<=1000) 随后的n行,每行有两个数a,b(0<a,b<100),表示矩形的长和宽
输出描述:
每组测试数据都输出一个数,表示最多符合条件的矩形数目,每组输出占一行
样例输入:
复制
1 10 1 2 2 4 5 8 6 10 7 9 3 1 5 8 12 10 9 7 2 2
样例输出:
5
思路:先把输入都转为长大宽小,然后长排个序,再来个最长递增子序列,就可以ac;
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int mn = 1005; int dp[mn]; struct node { int x, y; }t[mn]; bool cmp(node x, node y) { return x.x < y.x; } int main() { int i, j, n, m, x, y; scanf("%d",&m); while (m--) { scanf("%d",&n); for(i = 1;i <= n;i++) { scanf("%d%d",&x,&y); t[i].x = max(x,y); t[i].y = min(x,y); } sort(t+1,t+n+1,cmp); int maxx = 0; for (i = 1;i <= n;i++) { dp[i] = 1; for (j = 1;j < i;j++) { if (t[j].y < t[i].y && t[i].x > t[j].x) dp[i] = max(dp[i],dp[j]+1); } maxx = max(maxx,dp[i]); } printf("%d\n",maxx); } return 0; }