NYOJ 16 矩形嵌套(动态规划)

时间限制:3000 ms  |  内存限制:65535 KB

难度:4

  • 描述
  • 有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
/*16.矩形嵌套*/
#include<iostream>
#include<algorithm>

using namespace std;

//矩形结构,包含 长、宽
typedef struct
{
	int a;
	int b;
}nRectangle;

//声明矩形数组
nRectangle r[1000];

//交换矩形的长、宽
void Swap(int *a, int *b)
{
	*a=*a^*b;
	*b=*a^*b;
	*a=*a^*b;
}

//cmp
bool cmp(nRectangle c1, nRectangle c2)
{
	if(c1.a < c2.a) 
		return true;
	if(c1.a==c2.a && c1.b <= c2.b)
		return true;
	return false;
}

int main()
{
	int n,m,i,j,max,count;
	int dp[1000]={0};
	cin>>n;
	while(n--)
	{
		count = 1;
		cin>>m;
		//输入m个初始矩形长、宽
		for(i=0;i<m;i++)
		{
			cin>>r[i].a>>r[i].b;

			if(r[i].a<r[i].b)
				Swap(&r[i].a,&r[i].b);
		}

		sort(r,r+m,cmp);

		dp[0]=1;
		for(i=1;i<m;i++)
		{
			max=0;
			for(j=i-1;j>=0;j--)
				if(r[i].a>r[j].a && r[i].b>r[j].b)
					if(max < dp[j])
						max=dp[j];
			dp[i]=max+1;
			if(count<dp[i])
				count=dp[i];
		}

		cout<<count<<endl;
	}
	return 0;
}
时间: 2024-10-25 06:15:57

NYOJ 16 矩形嵌套(动态规划)的相关文章

NYOJ 16 矩形嵌套

矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有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),表示测试数据组数,每组测

NYOJ 16 矩形嵌套(经典DP)

http://acm.nyist.net/JudgeOnline/problem.php?pid=16 矩形嵌套 时间限制:3000 ms  |           内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中.你的任务是选出尽可能多的矩形排成一行,使得除最后一个

NYOJ 16 矩形嵌套 (DAG上的DP)

矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有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),表示测试数据组数, 每组

NYOJ 16 矩形嵌套【DP】

解题思路:呃,是看的紫书上面的做法,一个矩形和另一个矩形之间的关系就只有两种,(因为它自己是不能嵌套自己的),可嵌套,不可嵌套,是一个二元关系,如果可嵌套的话,则记为1,如果不可嵌套的话则记为0,就可以转化为求DAG(有向无环图,即一个点无论通过怎样的路径都不能回到自己这个点的图,符合本题矩形不能自己嵌套自己) d(i)表示从i点出发的最长路长度,最后再找出d(i)中的最大值即可. 矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用

南阳OJ 16 矩形嵌套

描述 有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<=10

NYOJ - 矩形嵌套(经典dp)

矩形嵌套时间限制:3000 ms | 内存限制:65535 KB 描述 有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),表示测试数据组数,每组测试数据的第一行是一

矩形嵌套-记忆化搜索(dp动态规划)

矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 有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).表示測试数据组

DAG模型(矩形嵌套)

推荐在线例题:http://acm.nyist.net/JudgeOnline/problem.php?pid=16 题摘: 矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中.你的任务是选出尽可能多的矩形排成一行,使得除最后

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