https://codeforces.com/problemset/problem/4/D

这个题目比较简单,就是一个DAG模型,这个可以看看紫书学习一下,

我这次是用dp来写的,用记忆化搜索也许更好写一点。

这个首先进行建图,用一个邻接表建图,G[i][j]表示第i个信封可以装进去第j个信封,这个再建图之前需要排序。

不然的话就不好写这个dp了,其实这里有一点点不太能理解。

建完图之后就是dp的转移,

dp[i]表示从第i个信封开始可以装的最多的信封

状态转移就是 d[i]=dp[j]+1

这个之后就是路径的输出,这个路径输出需要好好理解,

第一个就是怎么找到第一个数值,这个是一个for循环找到一个dp[i]==ans

然后就是递归找答案。

这个递归需要break,这个自行理解吧。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<vector>
#define inf 0x3f3f3f3f
#define debug(x) cout<<"-----"<<" x = "<<x<<"-----"<<endl
using namespace std;
typedef long long ll;
const int maxn = 5e3 + ;
struct node
{
int x, y, id;
node(int x=,int y=):x(x),y(y){}
}a[maxn]; bool cmp(node a,node b)
{
return a.x < b.x;
}
int n, w, h;
bool G[maxn][maxn];
void build()
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if (a[i].x > a[j].x&&a[i].y > a[j].y&&a[j].x > w&&a[j].y > h)
{
G[i][j] = ;
}
if (a[i].x > w&&a[i].y > h) G[i][] = ;
}
}
}
int dp[maxn];//表示从第i个可以嵌套的数量 void print_ans(int i)
{
for (int j = ; j <= n; j++)
{
if (G[i][j] && dp[i] == dp[j] + )
{
print_ans(j);
break;
}
}
printf("%d ", a[i].id);
} int main()
{
scanf("%d%d%d", &n, &w, &h);
for (int i = ; i <= n; i++)
{
scanf("%d%d", &a[i].x, &a[i].y), a[i].id = i;
}
sort(a + , a + + n, cmp);
build();
int ans = ;
memset(dp, , sizeof(dp));
for(int i=;i<=n;i++)
{
if(G[i][]) dp[i] = ;
for(int j=;j<=i;j++)
{
if (G[i][j]&&G[i][]) dp[i] = max(dp[i], dp[j]+);
}
ans = max(dp[i], ans);
}
printf("%d\n", ans);
int b = ;
for (int i = ; i <= n; i++) if (dp[i] == ans&&G[i][]) b = i;
if(b) print_ans(b);
return ;
}

D. Mysterious Present DAG dp的更多相关文章

  1. D. Mysterious Present (看到的一个神奇的DP,也可以说是dfs)

    D. Mysterious Present time limit per test 2 seconds memory limit per test 64 megabytes input standar ...

  2. Codeforces Beta Round #4 (Div. 2 Only) D. Mysterious Present 记忆化搜索

    D. Mysterious Present 题目连接: http://www.codeforces.com/contest/4/problem/D Description Peter decided ...

  3. dp--C - Mysterious Present

    C - Mysterious Present Peter decided to wish happy birthday to his friend from Australia and send hi ...

  4. D - Mysterious Present

    这个题和求最长递增序列的题类似,为了能输出一组可行的数据,我还用了一点儿链表的知识. Description Peter decided to wish happy birthday to his f ...

  5. Codeforces Round #460 (Div. 2): D. Substring(DAG+DP+判环)

    D. Substring time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...

  6. [SDOI2010] 所驼门王的宝藏 [建图+tarjan缩点+DAG dp]

    题面传送门: 传送门 思路: 看完题建模,容易得出是求单向图最长路径的问题 那么把这张图缩强联通分量,再在DAG上面DP即可 然而 这道题的建图实际上才是真正的考点 如果对于每一个点都直接连边到它所有 ...

  7. CF459E Pashmak and Graph (Dag dp)

    传送门 解题思路 \(dag\)上\(dp\),首先要按照边权排序,然后图都不用建直接\(dp\)就行了.注意边权相等的要一起处理,具体来讲就是要开一个辅助数组\(g[i]\),来避免同层转移. 代码 ...

  8. Codeforces Beta Round #4 (Div. 2 Only) D. Mysterious Present(LIS)

    传送门 题意: 现在我们有 n 个信封,然后我们有一张卡片,并且我们知道这张卡片的长和宽. 现给出这 n 个信封的长和宽,我们想形成一个链,这条链的长度就是这条链中所含有的信封的数量: 但是需要满足① ...

  9. Codeforces4D - Mysterious Present(LIS)

    题目大意 给你一张宽为w,长为h的的贺卡,然后给你n个信封,每个信封宽为wi,长为hi,问你最多能在贺卡上嵌套多少个信封,如果某个信封i如果能够装在信封j里,当且仅当w[i]<w[j]& ...

随机推荐

  1. php-fpm 进程数的设定

    近日,服务器出现异常,网站不能正常访问.经排查是php的问题. 在重启php-fpm时,恢复正常.1分钟之后又出现故障.查看php日志文件 /usr/local/php/var/log 后提示 WAR ...

  2. linux基础知识点扫描

    1.tty:查看自己的虚拟终端 2.echo "你的服务器已经被我控制,请立刻打钱给我,账号12312312312314123421,否则后果自负!!!"  >  /dev/ ...

  3. Xshell 中文提示乱码

    1.Alt+P 打开配置对话框,点击终端->编码,选择Unicode(utf-8)编码

  4. vue2.x学习笔记(十六)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12616543.html. 组件中的插槽 在2.6.0的版本中,vue为具名插槽和作用域插槽引入了一个新的统一的语法 ...

  5. CVE-2019-1388:Windows UAC 本地提权复现

    0x01 简介 用户帐户控制(User Account Control,简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制.其原理是通知用户是否对应用程序使用 ...

  6. JDBC处理CLOB 和 BLOB大对象

    在数据库中: clob用于存储大量的文本数据 可以使用字符流操作 clob用于存储大量的二进制数据 可以使用字节流操作 以mysql为例 先准备一张表: CREATE TABLE `t_user2` ...

  7. c++<ctime>中常用函数

    先说一下c++标准库并没有提供所谓的日期类型,而是继承了c的日期类型 <cmath>里面有些常用的函数,比如计时函数clock().获取系统时间的函数time(),下面就具体的介绍一下 1 ...

  8. 1、flink介绍,反压原理

    一.flink介绍  Apache Flink是一个分布式大数据处理引擎,可对有界数据流和无界数据流进行有状态计算. 可部署在各种集群环境,对各种大小的数据规模进行快速计算. 1.1.有界数据流和无界 ...

  9. tp5--Excel表格导入导出

    来源于:https://www.cnblogs.com/MyIsLu/p/6830579.html PHPExcel 扩展包下载地址:             https://github.com/P ...

  10. sql语句------合并结果集

    select id,max(val) FROM (select id,a 列名 val from 表名unionselect id,b 列名 val from 表名unionselect id,c 列 ...