本题大意:给定多个矩形的长和宽,让你判断最多能有几个矩形可以嵌套在一起,嵌套的条件为长和宽分别都小于另一个矩形的长和宽。

  本题思路:其实这道题和之前做过的一道模版题数字三角形很相似,大体思路都一致,这道题是很经典的DAG上的最长路问题,用dp[ i ]表示以i为出发点的最长路的长度,因为每一步都只能走向他的相邻点,则

d[ i ]  = max(d[ j ] + 1)这里 j 是任意一个面积比 i 小的举行的编号。

  下面的代码中附带了最小字典序最长路打印的问题,我们找到第一个路径最长的 i,往后每次都找第一个符合条件的 i 输出即可。

  参考代码:

 #include <iostream>
#include <cstring>
using namespace std; typedef pair<int ,int > P;
int n, m;
const int maxn = + , Max = + ;
int G[maxn][maxn], cnt, b;
int d[maxn];
P rectangle[Max]; bool check(int i, int j) {
return (rectangle[i].first > rectangle[j].first && rectangle[i].second > rectangle[j].second) ||
(rectangle[i].first > rectangle[j].second && rectangle[i].second > rectangle[j].first);
} int dp(int i) {
int &ans = d[i];
if(ans != -) return ans;
ans = ;
for(int j = ; j < maxn; j ++)
if(G[i][j] == ) ans = max(ans, dp(j) + );
cnt = max(cnt, ans);
return ans;
} void print_ans(int i) {
cout << i << '\t';
for(int j = ; j < maxn; j ++)
if(G[i][j] == && d[i] == d[j] + ) {
print_ans(j);
break;
}
} int main () {
int n;
cin >> n;
while(n --) {
cnt = ;
memset(d, -, sizeof d);
memset(G, -, sizeof G);
cin >> m;
for(int i = ; i < m; i ++)
cin >> rectangle[i].first >> rectangle[i].second;
for(int i = ; i < m; i ++)
for(int j = ; j < m; j ++)
if(check(i, j))
G[i][j] = ;
for(int i = ; i < m; i ++)
dp(i);
cout << cnt << endl;
for(int i = ; i < maxn; i ++) if(d[i] == cnt) b = i;
// print_ans(b);
}
return ;
}

NYOJ_矩形嵌套(DAG上的最长路 + 经典dp)的更多相关文章

  1. POJ 1949 Chores(DAG上的最长路 , DP)

    题意: 给定n项任务, 每项任务的完成用时t和完成每项任务前需要的k项任务, 求把所有任务完成的最短时间,有当前时间多项任务都可完成, 那么可以同时进行. 分析: 这题关键就是每项任务都会有先决条件, ...

  2. UVa 10285 最长的滑雪路径(DAG上的最长路)

    https://vjudge.net/problem/UVA-10285 题意: 在一个R*C的整数矩阵上找一条高度严格递减的最长路.起点任意,但每次只能沿着上下左右4个方向之一走一格,并且不能走出矩 ...

  3. Vulnerable Kerbals CodeForces - 772C【拓展欧几里得建图+DAG上求最长路】

    根据拓展欧几里得对于同余方程 $ax+by=c$ ,有解的条件是 $(a,b)|c$. 那么对于构造的序列的数,前一个数 $a$  和后一个数 $b$ ,应该满足 $a*x=b(mod m)$ 即 $ ...

  4. HDU 3249 Test for job (有向无环图上的最长路,DP)

     解题思路: 求有向无环图上的最长路.简单的动态规划 #include <iostream> #include <cstring> #include <cstdlib ...

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

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

  6. uva103(最长递增序列,dag上的最长路)

    题目的意思是给定k个盒子,每个盒子的维度有n dimension 问最多有多少个盒子能够依次嵌套 但是这个嵌套的规则有点特殊,两个盒子,D = (d1,d2,...dn) ,E = (e1,e2... ...

  7. HDU 4109 Instrction Arrangement(DAG上的最长路)

    把点编号改成1-N,加一点0,从0点到之前任意入度为0的点之间连一条边权为0的边,求0点到所有点的最长路. SPFA模板留底用 #include <cstdio> #include < ...

  8. hdu 1224(动态规划 DAG上的最长路)

    Free DIY Tour Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  9. zoj 3795 Grouping tarjan缩点 + DGA上的最长路

    Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Practic ...

随机推荐

  1. ubuntu防火墙命令初探

    1.防火墙的状态与开关 1)$sudo ufw status  //查看防火墙的状态及当前的设置规则 2)$sudo ufw enable //开启防火墙 3)$sudo ufw disable // ...

  2. linux MYSQL大小写问题处理

    1)window下默认大小写不敏感,所以在window下.创建表 test后再想创建表TEST会报错.而linux下默认可以.认为是不同的两张表 2)linux创建数据库,安装完毕后 首要任务是在li ...

  3. vue:在router里面给页面加title

    vue中给组件页面加页面标题:{ path: '/', name: 'index', component: disconnect, meta: { title: '首页' } }, { path: ' ...

  4. web前端安全的三个关键点

    一.浏览器的同源策略 同源策略:不同域的客户端脚本在未经授权的情况下不能读写对方的资源. 这里有几个关键词:域.脚本.授权.读写.资源 1.同域要求两个站点:同协议.同域名.同端口.下表展示了所列站点 ...

  5. C#可变参数params

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class TestPara ...

  6. Number的Util

    1. NumberUtils.isNumber() : 判断字符串是否是数字 NumberUtils.isNumber("5.96");//结果是true NumberUtils. ...

  7. LeetCode OJ 215. Kth Largest Element in an Array

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  8. Android Studio 版本间区别

    2.3.2 ->3.0.1  Gradle版本为4.1   com.android.tools.build:gradle:3.0.x Android Monitor 被换成了 Android P ...

  9. Ajax 学习 第三篇

    1.什么是json 第一种方法 第二种方法 比较evar and jsondata 任何时候使用EVAR要特别小心,他不会管输入对象的类型 JSONLint可以在线校验代码的正确性 改写代码

  10. Android计时器和倒计时

    Android计时器和倒计时 计时器两个核心类 Timer 和 TimerTask 1) Timer核心方法 Java代码  //Schedules the specified task for ex ...