博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
南阳OJ 16 矩形嵌套
阅读量:6201 次
发布时间:2019-06-21

本文共 1355 字,大约阅读时间需要 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),表示矩形的长和宽
输出
每组測试数据都输出一个数。表示最多符合条件的矩形数目。每组输出占一行
例子输入
1101 22 45 86 107 93 15 812 109 72 2
例子输出

5

思路:第一次打DAG上的动规。

实际上这个是一个有向图的最长路径问题,符合题目要求的用邻接表记录下来。表示能够由该节点走向下一个节点。之后就是考虑转移方程了。DP[i]=max(DP[i],dp(j)+1)。j为i出发的一个可行点。即从i可到达j。

以下给出AC代码(把路径打印的代码页附上):

#include
#include
#include
using namespace std;#define N 1005int link[N][N]; //邻接表int u[N],v[N]; //各点的长跟宽int d[N]; //到达i的最长路径int n,m;int dp(int i) //记忆化搜索{ int& ans=d[i]; if(ans>0)return d[i]; ans=1; for(int j=1;j<=n;j++) { if(link[i][j]) ans=max(ans,dp(j)+1); } return ans;}void print(int i){ printf("%d ",i); for(int j=1;j<=n;j++) { if(link[i][j]&&d[i]==d[j]+1) { print(j); break; } } printf("\n");}int main(){ int i,j; int t; scanf("%d",&t); while(t--) { int ans=0; scanf("%d",&n); memset(link,0,sizeof(link)); for(i=1;i<=n;i++) { scanf("%d %d",&u[i],&v[i]); if(u[i]>v[i]) swap(u[i],v[i]); } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(u[i]

转载地址:http://kbtca.baihongyu.com/

你可能感兴趣的文章
打印某年日历
查看>>
UITextView设置超链接,点击跳转到应用内的webView
查看>>
150127随手记
查看>>
页面里面设置简单的图形
查看>>
django 学习笔记(四)
查看>>
freemarker IDE 安装
查看>>
DOUBLE vs DECIMAL 区别
查看>>
Linux目录结构和常用命令
查看>>
TCP协议的三次握手和四次挥手
查看>>
C# 7.0
查看>>
安卓手机游戏 纪念碑谷1+2+被遗忘海岸+艾达的梦 解锁码
查看>>
电子商务另辟新径的发展
查看>>
我的友情链接
查看>>
LAMP安全加固笔记
查看>>
ILog JRules 官网摘录资料--JRules 产品及其安装
查看>>
oracle 11g 安装报错解决
查看>>
常见RPC框架汇总资料
查看>>
使用Powershell配置Hyper-V Server 资源计量
查看>>
【多进程】如何使用PHP编写daemon process
查看>>
驅 動 的 升 級
查看>>