[HNOI2010]CHORUS 合唱队 (区间DP)
题目描述
对于一个包含 NN 个整数的数列 AA ,我们可以把它的所有元素加入一个双头队列 BB .
首先 A1A1 作为队列的唯一元素,然后依次加入 A2∼ANA2∼AN ,如果 Ai<Ai−1Ai<Ai−1 那么从 BB 的左端加入 AiAi ,否则从 BB 的右端加入 AiAi .
给出最终的队列 BB ,求原数列有多少种可能排列。输出答案对 1965082719650827 取余 .
1≤N≤1000≤Bi≤20001≤N≤1000≤Bi≤2000 ,没有重复数 .
思路
显然我还是太菜了,被这道题虐了 ... 另外从大基哥那里搞了个清楚的题面(原题在此)过来.
读过题面之后,会发现,每一个状态的队列的前导状态只有两个,要么是第一个元素先进来,要么就是最后一个元素先进来.
这样子的话就比较容易想到区间DP的常用思路.
状态
f[i][j][1] 表示从 i 到 j 这段数列的最后一个进来的元素是 a[j] .
f[i][j][0] 则表示这段数列最后一个进来的元素是 a[i] .
然后就是 O(n^2) 的枚举区间.
动态转移方程的话,是根据它的前一步状态,分类讨论得.
主要思路就是讨论区间前后四个数的大小关系然后推得它可以由哪些状态推过来.
其实方程这个东西自己想一下还是对锻炼DP很有帮助的,建议自己想.
约束条件
约束条件就是所有枚举的 i j 与其相邻数值的大小比较 .
代码
#include<bits/stdc++.h>
using namespace std;
const int m=;
int n,f[][][],a[];
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]),f[i][i][]=;
for(int i=n;i>=;i--)
for(int j=i+;j<=n;j++)
{
if(a[j]>a[i]) f[i][j][]+=f[i][j-][];
if(a[j]>a[j-]) f[i][j][]+=f[i][j-][];
if(a[i]<a[i+]) f[i][j][]+=f[i+][j][];
if(a[i]<a[j]) f[i][j][]+=f[i+][j][];
f[i][j][]%=m;
f[i][j][]%=m;
}
cout<<(f[][n][]+f[][n][])%m;
return ;
}
[HNOI2010]CHORUS 合唱队 (区间DP)的更多相关文章
- 【BZOJ1996】[Hnoi2010]chorus 合唱队 区间DP
[BZOJ1996][Hnoi2010]chorus 合唱队 Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Ou ...
- BZOJ1996:[HNOI2010]CHORUS 合唱队(区间DP)
Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Solution 辣鸡guide真难用 ...
- 【BZOJ1996】【HNOI2010】合唱队 [区间DP]
合唱队 Time Limit: 4 Sec Memory Limit: 64 MB[Submit][Status][Discuss] Description Input Output Sample ...
- LG3205/BZOJ1996 「HNOI2010」合唱队 区间DP
区间DP 区间DP: 显然是一个区间向左右拓展形成的下一个区间,具有包含关系,所以可以使用区间DP. 状态设计: 考虑和关路灯一样设计状态 因为不知道当前这个区间是从哪个区间拓展而来,即不知道这个区间 ...
- 【BZOJ】1996: [Hnoi2010]chorus 合唱队【区间dp】
1996: [Hnoi2010]chorus 合唱队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2088 Solved: 1371[Submit][ ...
- BZOJ 1996: [Hnoi2010]chorus 合唱队(dp)
简单的dp题..不能更水了.. --------------------------------------------------------------- #include<cstdio&g ...
- bzoj1196:[Hnoi2010]chorus 合唱队
这数据范围明显的区间dp啊...然而据说二维会wa...那就写三维把... #include<cstdio> #include<cstring> #include<cct ...
- bzoj千题计划211:bzoj1996: [Hnoi2010]chorus 合唱队
http://www.lydsy.com/JudgeOnline/problem.php?id=1996 f[i][j][0/1] 表示已经排出队形中的[i,j],最后一个插入的人在[i,j]的i或j ...
- 【洛谷P3205】[HNOI2010]CHORUS 合唱队
合唱队 区间DP f[l][r][0/1]表示生成目标序列中的区间[l,r],最后一个数是a[l]/a[r] 的方案数 边界: f[i][i][0]=1 转移: f[l][r][0]=(a[l]< ...
随机推荐
- windows命令行快速启动软件
windows桌面上太多的应用程序快捷方式很影响美观,于是寻思使用类似Linux系统中命令行的方式来启动软件. 只需要3步: 1.建立一个目录A,用来存放快捷方式.比如,建立D:\path.并复制快捷 ...
- Spring MVC系列[1]—— HelloWorld
1.导入jar包 ioc mvc 复制spring-mvc.xml到src目录下. 2.web.xml <?xml version="1.0" encoding=" ...
- bfs染色法判定二分图
#include<iostream> #include<queue> #include<cstring> #include<cstdio> using ...
- 【Python】使用cmd模块构造一个带有后台线程的交互命令行界面
最近写一些测试工具,实在懒得搞GUI,然后意识到python有一个自带模块叫cmd,用了用发现简直是救星. 1. 基本用法 cmd模块很容易学到,基本的用法比较简单,继承模块下的Cmd类,添加需要的功 ...
- ES6新增Map、Set和iterable
Map需要一个二维数组 var test_map = new Map(["mians",99],["regink",88]) test_map.get(&quo ...
- sass --watch 失败bug
NameError: uninitialized constant Sass::Plugin::Compiler::SassListen 网上说法是sass v3.2.10有bug 但是我版本3.5. ...
- Linux进程通信之共享内存实现生产者/消费者模式
共享内存 共享内存是内核为进程创建的一个特殊内存段,它将出现在进程自己的地址空间中,其它进程可以将同一段共享内存连接(attach)到自己的地址空间.这是最快的进程间通信方式,但是不提供任何同步功能( ...
- perl学习之HERE文档
Perl的here文档机制是从UNIX shell中的here文档机制派生而来的. 和在shell中一样,Perl中的here文档也是面向行的引用表单,要求提供<<运算符,其后跟随一个初始 ...
- python--网络编程之socket
一 . 网络编程 CS架构 客户端服务端架构 服务端:提供服务的 客户端:享受服务的 BS架构:浏览器和服务端 网络通信流程: 集线器:将所有连接上它的电脑全部联通起来 交换机:升级版的集线器 网卡: ...
- git 常用命令及虚拟机服务器仓库搭建
$ git config --global user.email "you@example.com" $ git config --global user.name "Y ...