矩形嵌套

紫书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. 【NOIP2007】矩阵取数

    因为傻逼写错高精度搞了一下午浪费好多时间,好想哭qaq 原题: 帅帅经常更同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij据为非负整数.游戏规则如下: 1. 每次取数时须从每 ...

  2. kuangbin_UnionFind C (HDU 1213)

    过程模板 扫一下一共有几棵树 输出 #include <iostream> #include <string> #include <cstdio> #include ...

  3. C++ Unicode SBCS 函数对照表

    C++ Unicode SBCS 函数对照表,以备日后查阅 Generic SBCS UNICODE TCHAR char wchar_t _TEOF EOF WEOF _TINT int wint_ ...

  4. linux内核启动流程[转]

    启动流程一览 既然启动是很严肃的一件事,那我们就来了解一下整个启动的过程吧! 好让大家比较容易发现启动过程里面可能会发生问题的地方,以及出现问题后的解决之道! 不过,由於启动的过程中,那个启动管理程序 ...

  5. java DecimalFormat

    public class Test{ public static void main(String[] args) throws Exception{ /*DecimalFormat参数,如果是0则会 ...

  6. POI Workbook接口和HSSFWorkbook对象和XSSFWorkbook对象操作相应excel版本

    由于HSSFWorkbook只能操作excel2003一下版本,XSSFWorkbook只能操作excel2007以上版本,所以利用Workbook接口创建对应的对象操作excel来处理兼容性 @Te ...

  7. 让图片完全显示出来,应对overflow,以及在背景中完全显示出来

    1.应对overflow <script type="text/javascript"> $('.foo img').css('width','100%');//修正, ...

  8. C++ const使用详解

    1.const常量和宏常量const int max=100;#define max 100;const常量相对宏常量有两个有点:1)有类型安全检查2)占用内存空间少 2.const变量在内存中的位置 ...

  9. ExtJs 入门教程

    http://www.cnblogs.com/iamlilinfeng/archive/2012/12/31/2840663.html

  10. jQuery在IE浏览器上的html()报错 return !noData || noData !== true && elem.getAttribute("classid") === noData;

    解决方法是,将Query 1.10.2版本的源码中的3791行: return !noData || noData !== true && elem.getAttribute(&quo ...