NYOJ 16 矩形嵌套(经典动态规划)
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 矩形嵌套(经典动态规划)的更多相关文章
- NYOJ 16 矩形嵌套(动态规划)
矩形嵌套 时间限制: 3000 ms | 内存限制: 65535 KB 难度: 4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅 ...
- NYOJ 16 矩形嵌套(经典DP)
http://acm.nyist.net/JudgeOnline/problem.php?pid=16 矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度: ...
- nyoj 16 矩形嵌套
矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a& ...
- NYOJ 16 矩形嵌套 (DAG上的DP)
矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描写叙述 有n个矩形,每个矩形能够用a,b来描写叙述.表示长和宽.矩形X(a,b)能够嵌套在矩形Y(c,d)中当且仅当 ...
- NYOJ 16 矩形嵌套【DP】
解题思路:呃,是看的紫书上面的做法,一个矩形和另一个矩形之间的关系就只有两种,(因为它自己是不能嵌套自己的),可嵌套,不可嵌套,是一个二元关系,如果可嵌套的话,则记为1,如果不可嵌套的话则记为0,就可 ...
- NYOJ - 矩形嵌套(经典dp)
矩形嵌套时间限制:3000 ms | 内存限制:65535 KB 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b< ...
- nyoj 题目16 矩形嵌套
矩形嵌套 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a& ...
- oj.1677矩形嵌套,动态规划 ,贪心
#include<iostream> #include<algorithm> #include<cstring> using namespace std; stru ...
- nyoj 16-矩形嵌套(贪心 + 动态规划DP)
16-矩形嵌套 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:13 submit:28 题目描述: 有n个矩形,每个矩形可以用a,b来描述,表示长和 ...
随机推荐
- 打字机游戏Ⅱ之手速pk
前言 demo预览->typewriter gameⅡ (chrome only 没做兼容) 别看一开始时速度不快,会线性增长的哦,反正楼主的score还没达到过40... 为什么叫Ⅱ呢?之前写 ...
- 如何在Vue2中实现组件props双向绑定
Vue学习笔记-3 前言 Vue 2.x相比较Vue 1.x而言,升级变化除了实现了Virtual-Dom以外,给使用者最大不适就是移除的组件的props的双向绑定功能. 以往在Vue1.x中利用pr ...
- 使用Jekyll在Github上搭建博客
最近在玩github,突然发现很多说明网站或者一些介绍页面全部在一个域名是*****.github.io上. 好奇!!!真的好奇!!!怎么弄的?我也要一个~~~ 于是去网站上查询了一下,找到了http ...
- [leetcode]算法题目 - Sudoku Solver
最近,新加坡总理李显龙也写了一份代码公布出来,大致瞧了一眼,竟然是解数独题的代码!前几天刚刚写过,数独主要算法当然是使用回溯法.回溯法当时初学的时候在思路上比较拧,不容易写对.写了几个回溯法的算法之后 ...
- ALinq Dynamic 使用指南——代码的获取与编译
1.下载代码 ALinq Dynamic 项目托管在 CodePlex 网站,你可以使用浏览器下载压缩包,或者通过 SVN 获取. 项目网址:http://esql.codeplex.com/ 压缩包 ...
- 无法将分支 master 发布到远程 origin,因为远程存储库中已存在具有同一名称的分支
无法将分支 master 发布到远程 origin,因为远程存储库中已存在具有同一名称的分支.发布此分支将导致远程存储库中的分支发生非快进更新. 第一次用oschina的git设置完远程仓库后提交出现 ...
- HBase初探
string hbaseCluster = "https://charju.azurehdinsight.net"; string hadoopUsername = "账 ...
- c#自动关闭 MessageBox 弹出的窗口
我们都知道,MessageBox弹出的窗口是模式窗口,模式窗口会自动阻塞父线程的.所以如果有以下代码: MessageBox.Show("内容',"标题"); 则只有关闭 ...
- MySQL多实例
http://www.kancloud.cn/digest/mysqlsummary/132842http://crazy123.blog.51cto.com/1029610/1611887/ htt ...
- 日期处理-将String 转为Date
package com.test; import java.text.DateFormat; import java.text.ParseException; import java.text.Sim ...