某DP题目2
题意:
有一个栈,有n个数1~n按顺序插进栈中,但弹出顺序不定。另有m个限制,表示为a b,即数a必须在数b弹出之前弹出。问有多少种弹出的方案数。n <= 300,m <= 90000
分析
一开始看这题,怎样都没有头绪,画出模型也没看出什么东西来。
模拟一下进出栈,发现,若数x是最后弹出的,那么1~x-1和x+1~n的弹出过程都是独立的、互不影响的,也就是说可以划分为子问题解决,转化之后就是一个区间DP的模型了。
那么思考去掉限制,就可以得到DP方程:F[l][r] = Σ(F[l][x-1]*F[x+1][r]);(F[l][r]表示弹出的数的范围为l~r弹出的方案数,x为l~r中最后弹出的数)
加上限制会如何?我们选择分类讨论。
假设数a必须在数b弹出之前弹出,且l <= a <= b <= r,则只要a不是最后一个弹出的就可以了。
为什么呢?
1、a < x <= b显然是正确的;
2、l <= x <= a 或 b <= x <= r,只会影响一边,而dp得到的另一边显然是满足限制条件的。
那么当l <= b <= a <= r时呢?我们会发现,x是不能取b~a-1的,因为这样的话b肯定比a先弹出,就不满足限制条件了,也就是说这一段是不能转移的。
可以发现,每一个限制,它不能转移的x都是连续的一段,限制条件的增加也就是对这些段进行合并而已,这样的话我们很容易想到并查集来优化。
但这样优化后还不够优,还是会超时的,那我们继续优化。
对于每一个限制,假设为a、b,那么对这个限制有用的区间一定是l <= min(a, b),r >= max(a, b),其实就是一个矩阵。而对于限制的不可行k可以表示为两个矩形。枚举所有限制中的所有的不可行的k,按差分的方法把每个矩阵记录在一个二维数组之中,再做一遍前缀和,这样做dp的时候,就可以直接判断该点的前缀和是否大于0来判断这个转移是否可行。
综上所述,时间复杂度为O(n^3+nm)
某DP题目2的更多相关文章
- DP题目列表/弟屁专题
声明: 1.这份列表不是我原创的,放到这里便于自己浏览和查找题目. ※最近更新:Poj斜率优化题目 1180,2018,3709 列表一:经典题目题号:容易: 1018, 1050, 1083, 10 ...
- dp题目列表
此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 11 ...
- dp题目
从别的地方看来,最近一直在啃DP,有个目标,更有动力了. 1.Robberies 连接 :http://acm.hdu.edu.cn/showproblem.php?pid=2955 背包; ...
- 插头DP题目泛做(为了对应WYD的课件)
题目1:BZOJ 1814 URAL 1519 Formula 1 题目大意:给定一个N*M的棋盘,上面有障碍格子.求一个经过所有非障碍格子形成的回路的数量. 插头DP入门题.记录连通分量. #inc ...
- 很好的一个dp题目 Codeforces Round #326 (Div. 2) D dp
http://codeforces.com/contest/588/problem/D 感觉吧,这道题让我做,我应该是不会做的... 题目大意:给出n,L,K.表示数组的长度为n,数组b的长度为L,定 ...
- 两道很好的dp题目【4.29考试】
A 问题描述: 对于一个排列,考虑相邻的两个元素,如果后面一个比前面一个大,表示这个位置是上升的,用I表示,反之这个位置是下降的,用D表示.如排列3,1,2,7,4,6,5可以表示为DIIDID. 现 ...
- 题目1453:Greedy Tino(dp题目)
题目链接:http://ac.jobdu.com/problem.php?pid=1453 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
- 题目1452:搬寝室(dp题目)
题目链接:http://ac.jobdu.com/problem.php?pid=1452 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
- 题目1042:Coincidence(最长公共子序列 dp题目)
题目链接:http://ac.jobdu.com/problem.php?pid=1042 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
- 概率dp+期望dp 题目列表(一)
表示对概率和期望还不是很清楚定义. 目前暂时只知道概率正推,期望逆推,然后概率*某个数值=期望. 为什么期望是逆推的,例如你求到某一个点的概率我们可以求得,然后我们只要运用dp从1~n每次都加下去就好 ...
随机推荐
- C - Contest Setting Gym - 101982C dp 补题
题目链接:https://vjudge.net/contest/273260#problem/C 学习了一下别人的思路,首先去重,然后离散化. dp数组开二维,每一次更新,状态转移方程,dp[ i ] ...
- stanfordCorenlp在python3中的安装使用+词性学习
1 安装 前言 Stanford CoreNLP的源代码是使用Java写的,提供了Server方式进行交互.stanfordcorenlp是一个对Stanford CoreNLP进行了封装的Pytho ...
- PHP对象5: define / const /static
define定义全局常量: define('PATH', '/data/home/www'); const也是定义常量, 一般用于类中, 饰成员属性,不可以修饰方法,如下: class Test{ c ...
- usb_submit_urb 解释的够够的
/** * usb_submit_urb - issue an asynchronous transfer request for an endpoint * @urb: pointer to the ...
- Fedora8 U盘安装
(一)分区 在XP下"我的电脑“管理功能,对硬盘分区,目的是从逻辑分区中拿出20G空间,分成3个盘(必须为逻辑盘): (1)512MB 用作Linux swap分区: (2)200MB ...
- 作为一个新手的Oracle(DBA)学习笔记【转】
一.Oracle的使用 1).启动 *DQL:数据查询语言 *DML:数据操作语言 *DDL:数据定义语言 DCL:数据控制语言 TPL:事务处理语言 CCL:指针控制语言 1.登录 Win+R—cm ...
- 338.Counting Bits---位运算---《剑指offer》32
题目链接:https://leetcode.com/problems/counting-bits/description/ 题目大意:求解从0到num的所有数的二进制表示中所有1的个数. 法一:暴力解 ...
- MySQL 视图、触发器、函数、存储过程
1. 视图 1.1 什么是视图 通俗来讲,视图就是一条 select 语句执行后返回的结果集.所有我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上. 1.2 视图的特性 视图是对若干张基 ...
- Spring如何解析Dubbo标签
1. 要了解Dubbo是如何解析标签的,首先要清楚一点就是Spring如何处理自定义标签的,因为Dubbo的标签可以算是Spring自定义标签的一种情况: 2. Spring通过两个接口来解析自定义的 ...
- fedroa20 没法开启ntpd服务器
1现象:ntpd老是没法开启,ntpd -d显示有个进程占用123端口. [root@vd13crmtb01 ~]# systemctl enable ntpd.service //开 ...