http://acm.hdu.edu.cn/showproblem.php?pid=5181

题意:
有一个栈,其中有n个数1~n按顺序依次进入栈顶,在某个时刻弹出。
其中m个限制,形如数字A必须在数字B之前弹出。
求方案总数
 
dp[i][j]表示数字i~j的出栈方案数
枚举最后一个出栈的数k,若k合法
dp[i][j]+=dp[i][k]*dp[k+1][j]
如何判断k是否合法?
 
对于一组i,j,k来说,它的弹出顺序是 [i,k-1]早于[k+1,j]早于k
对于一个限制 A必须在B之前出栈 
它只会对 i<=min(A,B),j>=max(A,B) 的 dp[i][j] 产生影响
若A<B,
a、i<=k<A或B<k<=j,产生的影响已在子DP中求出
b、k=A,A最后出栈,显然不合法
c、k=B,B最后出栈,显然合法
d、A<k<B,[A,k-1]早于[k+1,B]早于k出栈,所以合法
若B<A,
a、i<=k<B或A<k<=j,产生的影响已在子DP中求出
b、k=A,A最后出栈,显然不合法
c、k=B,B最后出栈,显然合法
d、B<k<A,[B,k-1]早于[k+1,A]早于k出栈,所以不合法
综上所述
对于一个限制A必须在B之前出栈
若A<B,当k=A时不合法
若B<A,当k∈(B,A]时不合法
这样的话之间复杂度时O(n^3 * m)
 
对于限制A必须在B之前出栈,如果确定了不能用k转移
考虑这些区间有哪些
令mi=min(A,B),mx=max(A,B)
那么区间
[1,mx] [1,mx+1] [1,mx+2]……[1,n]
[2,mx] [2,mx+1] [2,mx+2]……[2,n]
……
[mi][mx] [mi,mx+1] [mi,mx+2]……[mi,n]
不能用k转移
如果把这些区间的左右端点当做二维平面上的一个点对
那么这些区间就是 以[1,mx]为左上角,以[mi,n]为右下角的一个矩形
那么对于每个k,利用差分和前缀和预处理出这些矩形,就可以做到O(1)查询k转移dp[l,r]是否合法
时间复杂度为O(n^3 + nm)
 
 
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm> using namespace std; const int mod=1e9+; #define N 302
#define M 90001 int n,m; int lim[M][]; int a[N][N][N]; int dp[N][N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void add(int xl,int yl,int xr,int yr,int k)
{
a[xl][yl][k]++;
a[xl][yr+][k]--;
a[xr+][yl][k]--;
a[xr+][yr+][k]++;
} void pre()
{
memset(a,,sizeof(a));
int mi,mx;
for(int i=;i<=m;++i)
{
mi=min(lim[i][],lim[i][]);
mx=max(lim[i][],lim[i][]);
if(lim[i][]<lim[i][]) add(,mx,mi,n,lim[i][]);
else
for(int j=lim[i][]+;j<=lim[i][];++j) add(,mx,mi,n,j);
}
for(int k=;k<=n;++k)
{
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
a[i][j][k]=a[i-][j][k]+a[i][j-][k]-a[i-][j-][k]+a[i][j][k];
}
} void DP()
{
memset(dp,,sizeof(dp));
for(int i=;i<=n;++i) dp[i][i]=;
for(int i=;i<=n+;++i) dp[i][i-]=;
for(int i=n-;i;--i)
for(int j=i+;j<=n;++j)
for(int k=i;k<=j;++k)
if(!a[i][j][k])
dp[i][j]=(dp[i][j]+(long long)dp[i][k-]*dp[k+][j])%mod;
cout<<dp[][n]<<'\n';
} int main()
{
int T;
read(T);
bool tag;
while(T--)
{
read(n); read(m);
tag=true;
for(int i=;i<=m;++i)
{
read(lim[i][]),read(lim[i][]);
if(lim[i][]==lim[i][]) tag=false;
}
if(!tag) { puts(""); continue; }
pre();
DP();
}
}
 

hdu 5181 numbers的更多相关文章

  1. hdu 5181 numbers——思路+区间DP

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5181 题解:https://www.cnblogs.com/Miracevin/p/10960717.ht ...

  2. HDU.5181.numbers(DP)

    题目链接 参考. \(Description\) 将\(1,2,\cdots,n(n\leq 300)\)依次入栈/出栈,并满足\(m(m\leq 90000)\)个形如\(x\)要在\(y\)之前出 ...

  3. HDU 6168 - Numbers | 2017 ZJUT Multi-University Training 9

    /* HDU 6168 - Numbers [ 思维 ] | 2017 ZJUT Multi-University Training 9 题意: .... 分析: 全放入multiset 从小到大,慢 ...

  4. HDU 5522 Numbers 暴力

    Numbers Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5522 ...

  5. hdu 5585 Numbers

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5585 思路:对于2和5只须看最后一位数,对于三看所有位的数字之和就行 #include<stdi ...

  6. hdu 5585 Numbers【大数+同余定理】

    Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  7. hdu 6168 Numbers

    Numbers Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total S ...

  8. 2017 ACM暑期多校联合训练 - Team 9 1008 HDU 6168 Numbers (模拟)

    题目链接 Problem Description zk has n numbers a1,a2,...,an. For each (i,j) satisfying 1≤i<j≤n, zk gen ...

  9. HDU Humble Numbers

    Problem Description A number whose only prime factors are 2,3,5 or 7 is called a humble number. The ...

随机推荐

  1. Postman安装与入门使用

    Postman官方下载地址:https://www.getpostman.com/apps Postman 是一个很强大的 API调试.Http请求的工具.我们可以用来很方便的模拟get或者post或 ...

  2. C# List left join

    public class Test1 { public int ID { get; set; } public string Name { get; set; } } public class Tes ...

  3. Serverless架构详解:开发者如何专注于业务代码本身?

    本文来自腾讯云技术沙龙,本次沙龙主题为Serverless架构开发与SCF部署实践 演讲嘉宾:黄文俊,曾负责企业级存储.企业级容器平台等产品的架构与开发,目前主要负责SCF腾讯无服务器云函数产品相关. ...

  4. "Regressing Robust and Discriminative 3D Morphable Models with a very Deep Neural Network" 解读

    简介:这是一篇17年的CVPR,作者提出使用现有的人脸识别深度神经网络Resnet101来得到一个具有鲁棒性的人脸模型. 原文链接:https://www.researchgate.net/publi ...

  5. 从零系列--开发npm包(一)

    一.目的 主要是纪录和回顾自己开发的一些步骤以及遇到的一些问题和解决方案 二.准备工作 1.IDE 选择 VS Code 2.安装node 环境 (https://nodejs.org/zh-cn/) ...

  6. imagick用法!

    https://coderwall.com/p/9hj97w sudo apt-get install imagemagick sudo apt-get install php5-imagick su ...

  7. python发送邮件脚本ssl 465端口

    #coding:utf8 from smtplib import SMTP_SSL from email.header import Header from email.mime.text impor ...

  8. ContentProvider示例

    http://hi.baidu.com/pekdou/item/b2a070c37552af210831c678 首先,我自己是各初学者,网上一些关于ContentProvider的例子也不少,我自己 ...

  9. “一片空白”的c#

    using System; using System.Collections.Generic; using System.Text; namespace FindTheNumber           ...

  10. Beta阶段敏捷冲刺总结

    设想和目标 1. 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述?       在最开始的时候我们就是为了解决集美大学计算机工程学院网页没有搜索引擎的问题.因为没有搜 ...