矩形嵌套

紫书P262 这是有向无环图DAG(Directed Acyclic Graph)上的动态规划,是DAG最长路问题

【题目链接】NYOJ16-矩形嵌套

【题目类型】DAG上的dp

&题解:

矩形之间的"可嵌套"关系是一个典型的二元关系,二元关系可以用图来建模。如果矩形X可以嵌套在矩形Y里,我们就从X到Y连一条有向边。这个有向图是无环的,因为一个矩形无法直接或间接地嵌套在自己的内部。换句话说,它是一个DAG。这样,我们的任务便是求DAG上的最长路径。

紫书是这么说的,那么现在我们就已经将问题转化了,那我现在再说一下代码的问题:

int dp(int i){
if (d[i]!=0) return d[i];
d[i]=1;
rep(j,n) if (G[i][j]) d[i]=max(d[i],dp(j)+1);
return d[i];
}

这块,你要知道:函数dp求的是从i点到所以点的最远值,也就是说,假如你调用dp(3)他返回的是3到所有点的最远值。

所以你现在应该知道了,在调用dp的时候外面应该在套一层n的循环,代表每个点到终点的最远值,之后在循环中求最大值res,最后输出res就好了。

为什么dp(i)求的是从i点到各个点的最远值呢?

因为你传进去i,他第一步只会找到与i点连接的点,之后递归,第二步找到与i点连接的点的连接的点,之后继续递归……

所以他只会求出从i点到各个点的最远值。

但为什么又是最远的值呢? 因为他每次都把d[i]更新,d[i]=max(d[i],dp(j)+1); 并且还返回d[i],所以是最远的值。

这题还告诉我们,记忆化中的数组只是代表是否走过,他的值并没有什么特殊意义,我们需要的只是最后dp的返回值而已。

【时间复杂度】O(n^2)

&代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define cle(a,val) memset(a,(val),sizeof(a))
#define SI(N) scanf("%d",&(N))
#define SII(N,M) scanf("%d %d",&(N),&(M))
#define rep(i,b) for(int i=0;i<(b);i++)
#define PI(A) cout<<(A)<<endl;
const int MAXN = 1000 + 5 ;
struct node{
int x,y;
}a[MAXN];
int n,d[MAXN];
bool G[MAXN][MAXN];
int dp(int i){
//remember
if (d[i]!=0) return d[i];
d[i]=1;
rep(j,n) if (G[i][j]) d[i]=max(d[i],dp(j)+1);
return d[i];
}
void Solve()
{
SI(n);
rep(i,n){
SII(a[i].x,a[i].y);
if(a[i].x<a[i].y) swap(a[i].x,a[i].y);
}
cle(G,0);
rep(i,n) rep(j,n){
if (i==j) continue;
if (a[i].x<a[j].x&&a[i].y<a[j].y){
G[i][j]=1;
}
}
int res=0;
rep(i,n){
cle(d,0);
int tm=dp(i);
res=max(res,tm);
}
PI(res)
}
int main()
{
int T;cin>>T;while(T--)
Solve();
return 0;
}

NYOJ16 矩形嵌套(DAG最长路)的更多相关文章

  1. 「BZOJ1924」「SDOI2010」 所驼门王的宝藏 tarjan + dp(DAG 最长路)

    「BZOJ1924」[SDOI2010] 所驼门王的宝藏 tarjan + dp(DAG 最长路) -------------------------------------------------- ...

  2. uva 10051 Tower of Cubes(DAG最长路)

    题目连接:10051 - Tower of Cubes 题目大意:有n个正方体,从序号1~n, 对应的每个立方体的6个面分别有它的颜色(用数字给出),现在想要将立方体堆成塔,并且上面的立方体的序号要小 ...

  3. 简单Dp----最长公共子序列,DAG最长路,简单区间DP等

    /* uva 111 * 题意: * 顺序有变化的最长公共子序列: * 模板: */ #include<iostream> #include<cstdio> #include& ...

  4. BZOJ 5450 轰炸 (强连通缩点+DAG最长路)

    <题目链接> 题目大意: 有n座城市,城市之间建立了m条有向的地下通道.你需要发起若干轮轰炸,每轮可以轰炸任意多个城市.但每次轰炸的城市中,不能存在两个不同的城市i,j满足可以通过地道从城 ...

  5. NYOJ_矩形嵌套(DAG上的最长路 + 经典dp)

    本题大意:给定多个矩形的长和宽,让你判断最多能有几个矩形可以嵌套在一起,嵌套的条件为长和宽分别都小于另一个矩形的长和宽. 本题思路:其实这道题和之前做过的一道模版题数字三角形很相似,大体思路都一致,这 ...

  6. NYOJ16 矩形嵌套 【DAG上的DP/LIS】

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

  7. uva 10131 Is Bigger Smarter?(DAG最长路)

    题目连接:10131 - Is Bigger Smarter? 题目大意:给出n只大象的属性, 包括重量w, 智商s, 现在要求找到一个连续的序列, 要求每只大象的重量比前一只的大, 智商却要小, 输 ...

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

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

  9. UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索

    题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子. 要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明 ...

随机推荐

  1. 工作中遇到的问题--Hibernate注解添加在一方和多方的区别

    以Good和GoodStatus为例: 一.注解仅添加在一方: @Entity@Table(name = "GOOD")@Where(clause="enabled=1& ...

  2. JavaWeb学习记录(九)——Cookie的增加、删除、查看

    一.servlet功能代码: public void doGet(HttpServletRequest request, HttpServletResponse response)           ...

  3. Codeforces Round #118 (Div. 2)

    A. Comparing Strings 判断不同的位置个数以及交换后是否相等. B. Growing Mushrooms 模拟. C. Plant 矩阵+快速幂 D. Mushroom Scient ...

  4. scala言语基础学习三(面向对象编程)

    定义一个简单的类 //定义类,包含field以及方法 自定义的getter 和setter 仅仅暴露field的getter和setter方法 private[this]的使用 (只能在当前实例中使用 ...

  5. PC端的混合应用通讯问题

    exe使用C#开发,内嵌HTML页面HTML页面与exe程序的通讯方式可以使用以下方式: HTML通知exe:C#有个titlechange事件,可以监听内部HTML的title,那么HTML就可以通 ...

  6. ARM1138@PWM例程分析

    1. Buzzer例程控制原理 由ARM1138原理图可得:Buzzer使用CCP3(对应GPIO-G组0x40026000,4号引脚0x00000010)作为输入引脚: Buzzer例程结构: 涉及 ...

  7. Lua快速入门

    -- 两个横线开始单行的注释 --[[ 加上两个[和]表示 多行的注释. --]] ---------------------------------------------------- -- 1. ...

  8. away3d学习

    http://www.cnblogs.com/flash3d/p/3403109.html M3U8文件简介:http://blog.sina.com.cn/s/blog_6cf7acdf0102v0 ...

  9. 动态加载dll,并创建类对象放入到list中。

    private List<IVisualControlsPlug> visualPlugs = new List<IVisualControlsPlug>(); public ...

  10. combobox select .change onSelect事件触发

    我现在要完成的功能是:有两个下拉框,当地一个下拉框选择了第一个选项时,第二个下拉框不可用,否则就可用. 用了jQuery easyUI提供的onSelect方法.如下:js文件:$('#select1 ...