[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]< ...
随机推荐
- Clown without borders 2017/1/9
原文 Taking laughter to those who need it most "When will you all return again?"the Croatian ...
- LibreOJ #103. 子串查找
题目描述 这是一道模板题. 给定一个字符串 A AA 和一个字符串 B BB,求 B BB 在 A AA 中的出现次数. A AA 中不同位置出现的 B BB 可重叠. 输入格式 输入共两行,分别是字 ...
- Python 输入输出 数据类型 变量
python输入输出 数据类型 变量 输入输出 print()在Python3中是函数 >>>print('hello world') #print注意print前面不要有任何空格 ...
- 服务器配置iis,php网站
1.在iis中选择物理路径.配置域名 2.添加php默认文档 3.修改处理程序映射 4.设置模块映射信息
- 初识 Hibernate
Hibernate 框架 1.1 什么是框架? 框架是一个提供了可重用的公共结构半成品. 2.1 关于Hibernate Hibernate是数据持久层的一个轻量级框架.数据持久层的框架有很多 ...
- shell脚本,提示用户输入一个用户名,如果存在;显示用户UID和SHELL信息;否则,则显示无此用户;显示完成之后,提示用户再次输入;如果是quit则退出;
[root@localhost wyb]# cat tishiuser.sh #!/bin/bash #提示用户输入一个用户名,如果存在:显示用户UID和SHELL信息:否则, #则显示无此用户:显示 ...
- 组合的输出(DFS)
题目描述: 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r<=n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数. 现要求你用递归的方法输出 ...
- nginx目录结构和配置文件
nginx软件功能模块说明 Nginx软件之所以强大,是因为它具有众多的功能模块,下面列出了企业常用的重要模块. (1) Nginx核心功能模块(Core functionality)nginx核心功 ...
- 如何用纯 CSS 创作一个菱形 loader 动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/eKzjqK 可交互视频教 ...
- 七丶人生苦短,我用python【第七篇】
模块 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个 ...