nyoj 16 矩形嵌套(DAG上的dp)
来源:互联网 发布:剃刀数据 编辑:程序博客网 时间:2024/05/17 21:51
描述
有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
样例输出
有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
分析:
矩形之间的”可嵌套“关系是一个典型的二元关系,二元关系可以用图来建模。如果矩形x可以嵌套在矩形y中,就从x到y连一条有向边,这个有向图是无环的,因为矩形无法嵌套他自己。换句话说他是DAG,求DAG上的最长路径。
#include <cstdio>#include<cstring>#define maxn 1000+10int max(int a, int b){ return a>b?a:b;}typedef struct //矩形的数据结构,长、宽{ int length; int width;} rectangle;int G[maxn][maxn]; //DAG图的矩阵表示int d[maxn],n;//d[i]顶点i的最长路径rectangle rec[maxn];//打印出图的邻接矩阵,目的是确保建图正确无误void print_Graph(){ printf("|矩 形|"); for(int i=0; i<n; i++) printf("%2d,%2d|",rec[i].length,rec[i].width); printf("\n"); for(int i=0; i<n; i++) { for(int k=0; k<=n; k++) printf("--"); printf("\n"); printf("|%d,%d|",rec[i].length,rec[i].width); for(int j=0; j<n; j++) { printf(" %d |",G[i][j]); } printf("\n"); }}//构造图void createGraph(){ memset(G,0,sizeof(G)); for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { if(rec[i].length>rec[j].length && rec[i].width>rec[j].width) { G[i][j]=1; //rec[i] 包含 rec[j] } } } //print_Graph();}//记忆化搜索程序int dp(int i){ int& ans=d[i];//为该表项声明一个引用,简化对它的读写操作。 if(ans>0) return ans; ans=1; for(int j=0; j<n; j++) { if(G[i][j]) ans = max(ans, dp(j) + 1); } return ans;}int main(){ int N; scanf("%d",&N); while(N-->0) { int ans=0; scanf("%d",&n); for(int i=0; i<n; i++) { int tmp1,tmp2; scanf("%d%d",&tmp1,&tmp2); rec[i].length=tmp1>tmp2?tmp1:tmp2; rec[i].width=tmp1<tmp2?tmp1:tmp2; } createGraph(); //初始化记忆数组 memset(d,0,sizeof(d)); for(int i=0; i<n; i++) { int tmp=dp(i); ans=max(ans,tmp); } printf("%d\n",ans); } return 0;}
0 0
- NYOJ 16 矩形嵌套(DAG上的DP)
- nyoj 16 矩形嵌套(DAG上的dp)
- nyoj 16 矩形嵌套 (DAG上的DP)
- NYOJ 16 矩形嵌套 (DAG上的DP)
- nyoj 16 嵌套矩形(DAG上的动态规划)
- nyoj 16 矩形嵌套 (DAG上的动态规划)
- NYOJ 16 矩形嵌套(DAG上的动态规划)
- 嵌套矩形 DAG上的dp(深搜+dp)
- NYoj16 矩形嵌套 DAG上的Dp
- NYOJ 16 矩形嵌套 DAG或排序+DP
- [DAG上的动态规划]NYOJ 矩形嵌套
- NYoj 16 矩形嵌套 (DAG上最长路
- DAG上的DP之 —— 矩形嵌套
- nyoj-16 矩形嵌套 (DAG上的动态规划,记忆化搜索)
- nyoj 16 矩形嵌套(基础dp)
- nyoj16矩形嵌套(DAG上的动态规划)
- 矩形嵌套-DAG上的动态规划
- DAG上的动态规划--嵌套矩形
- 单例模式
- Cocos2d - Action学习总结
- thinkpad alert键一直处于按着的状态
- asort.php
- Try、catch和finally
- nyoj 16 矩形嵌套(DAG上的dp)
- spring mvc 项目配置
- Eclipse 导入Xutils3.0
- LateX练习:写一份实验报告
- 关于一些简单的存储过程知识
- 字符串逆序排列
- 第九周项目36-阅读程序,写出执行结果(1)
- (OK) dnf - Fedora23——删除多余不用的内核
- 正则表达式知识详解之实战 读取网页中超链接 (java版示例)