传送门

Description

有n个矩形,每个矩形可以用a,b来描述,表示长和宽。矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度)。例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中。你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内。

Input

第一行是一个正正数N(0<N<10),表示测试数据组数,
每组测试数据的第一行是一个正正数n,表示该组测试数据中含有矩形的个数(n<=1000)
随后的n行,每行有两个数a,b(0<a,b<100),表示矩形的长和宽

Output

每组测试数据都输出一个数,表示最多符合条件的矩形数目,每组输出占一行

Sample Input

1
10
1 2
2 4
5 8
6 10
7 9
3 1
5 8
12 10
9 7
2 2

Sample Output

5

思路

  一、对于输入的a,b将较大的值赋给矩形的长,较小的值赋给矩形的宽,然后对矩形的长从小到大排序,这样保证了前面的矩阵不可能嵌套在后面中,然后只要对宽进行判断就行了。这样问题就转化为最长上升子序列了。

二、利用图模型解决,假设X可以嵌套在Y中,就从X到Y连一条边,这个有向图是无环的,也就是DAG图,这样,问题转化为求DAG上的最长路径

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1005;
struct Node{
	int len,wid;
}node[maxn];

bool cmp(struct Node xx,struct Node yy)
{
	if (xx.len == yy.len)	return xx.wid < yy.wid;
	else	return xx.len < yy.len;
}

int main()
{
	int T;
	scanf("%d",&T);
	while (T--)
	{
		int N,l,w,res = 0;
		int dp[maxn] = {0};
		scanf("%d",&N);
		for (int i = 0;i < N;i++)
		{
			scanf("%d%d",&l,&w);
			node[i].len = l > w?l:w;
			node[i].wid = w < l?w:l;
		}
		sort(node,node+N,cmp);
		for (int i = 0;i < N;i++)     //转化为求最长上升子序列
		{
			dp[i] = 1;
			for (int j = 0;j < i;j++)
			{
				if (node[i].wid > node[j].wid && node[i].len > node[j].len && dp[j] + 1 > dp[i])
				{
					dp[i] = dp[j] + 1;
				}
			}
			res = max(res,dp[i]);
		}
		printf("%d\n",res);
	}
	return 0;
}

  

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1005;
struct Node{
	int len,wid;
}node[maxn];
int dp[maxn],edge[maxn][maxn];

bool cmp(struct Node x,struct Node y)
{
	if (x.len == y.len)	return x.wid < y.wid;
	else	return x.len < y.len;
} 

void addedge(int N)
{
	for (int i = 0;i < N;i++)
	{
		for (int j = i + 1;j < N;j++)
		{
			if (node[i].len < node[j].len && node[i].wid < node[j].wid)	edge[i][j] = 1;
		}
	}
}

int solve(int i,int N)
{
	int &ans = dp[i];          //为表项dp[i]声明了一个引用,这样,任何对ans的读写实际上都是在对dp[i]进行,实际上,当dp[i]换成dp[i][j][k]这样的长名字,该技巧优势更明显
	if (ans > 0)	return ans;
	ans = 1;
	for (int j = 0;j < N;j++)	if (edge[i][j])	ans = max(ans,solve(j,N) + 1);
	return ans;
}

int main()
{
	int T,N,x,y;
	scanf("%d",&T);
	while (T--)
	{
		int tmp,res = 0;
		memset(dp,0,sizeof(dp));
		memset(edge,0,sizeof(edge));
		scanf("%d",&N);
		for (int i = 0;i < N;i++)
		{
			scanf("%d%d",&x,&y);
			node[i].len = x>y?x:y;
			node[i].wid = x<y?x:y;
		}
		sort(node,node+N,cmp);
		addedge(N);
		for (int i = 0;i < N;i++)
		{
			tmp = solve(i,N);
			res = tmp>res?tmp:res;
		}
		printf("%d\n",res);
	}
	return 0;
}

  

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

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

    矩形嵌套 时间限制: 3000 ms  |  内存限制: 65535 KB 难度: 4   描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅 ...

  2. NYOJ 16 矩形嵌套(经典DP)

    http://acm.nyist.net/JudgeOnline/problem.php?pid=16 矩形嵌套 时间限制:3000 ms  |           内存限制:65535 KB 难度: ...

  3. nyoj 16 矩形嵌套

    矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a& ...

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

    矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 有n个矩形,每个矩形能够用a,b来描写叙述.表示长和宽.矩形X(a,b)能够嵌套在矩形Y(c,d)中当且仅当 ...

  5. NYOJ 16 矩形嵌套【DP】

    解题思路:呃,是看的紫书上面的做法,一个矩形和另一个矩形之间的关系就只有两种,(因为它自己是不能嵌套自己的),可嵌套,不可嵌套,是一个二元关系,如果可嵌套的话,则记为1,如果不可嵌套的话则记为0,就可 ...

  6. NYOJ - 矩形嵌套(经典dp)

    矩形嵌套时间限制:3000 ms | 内存限制:65535 KB 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b< ...

  7. nyoj 题目16 矩形嵌套

    矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a& ...

  8. oj.1677矩形嵌套,动态规划 ,贪心

    #include<iostream> #include<algorithm> #include<cstring> using namespace std; stru ...

  9. nyoj 16-矩形嵌套(贪心 + 动态规划DP)

    16-矩形嵌套 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:13 submit:28 题目描述: 有n个矩形,每个矩形可以用a,b来描述,表示长和 ...

随机推荐

  1. 似魔鬼的 『 document.write 』

    在平时的工作中,楼主很少用 document.write 方法,一直觉得 document.write 是个危险的方法.楼主不用,并不代表别人不用,最近给维护的项目添了一点代码,更加深了我对 &quo ...

  2. 理解JavaScript的作用域链

    上一篇文章中介绍了Execution Context中的三个重要部分:VO/AO,scope chain和this,并详细的介绍了VO/AO在JavaScript代码执行中的表现. 本文就看看Exec ...

  3. SVN——配置和安装

    SVN安装步骤: 所有安装文件下载地址:http://pan.baidu.com/s/1bocNTDl 一.安装01----VisualSVN-Server-3.4.2-x64.msi 文件 直接下一 ...

  4. STL中的next_permutation

    给定一个数组a[N],求下一个数组. 2 1 3 4 2 1 4 3 2 3 1 4 2 3 4 1 ..... 在STL中就有这个函数: 1.参数是(数组的第一个元素,数组的末尾),注意这是前闭后开 ...

  5. 关于HTML+CSS设置图片居中的方法

    有的时候我们会遇到这样一个问题,就是当我们按下F12进行使用firebug调试的时候,我们发现图像没有居中,页面底下有横向的滑动条出现,图片没能够居中,默认状态下只是紧靠在页面最左侧,而我们对图像缩小 ...

  6. 【Zeyphr】保存json到数据库

    方法一: public int SaveJob(JObject data) { var formWrapper = RequestWrapper.Instance().LoadSettingXmlSt ...

  7. 为Mac Terminal设置代理

    参考链接:http://tz101.github.io/new-mac-os-x-yosemite-10-10-Xcode-Brew-Shadowsocks-Proxychains/ https:// ...

  8. 十天冲刺---Day7

    站立式会议 站立式会议内容总结: 燃尽图 照片 两个人编码其实效率挺高的.但是在一些方面,比如说页面UI的编写,会非常吃力,很难达到自己的效果. 由于埋头在编码,所以issues的增加随之停止. 有点 ...

  9. 用一条sql语句显示数据百分比并加百分号

    来源于:http://neil-han.iteye.com/blog/1948124 求数值所占比重 关键点:(round(t1.cnt/t2.totalCount*100,2))||'%'

  10. iPad开发--美团界面的搭建(主要是对Popover的使用,以及监听)

    一.主界面的搭建,效果图.设置self.navigationItem.leftBarButtonItems属性. 由于leftBarButtonItem是通过xib文件创建的,通过xib创建的控件默认 ...