[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]< ...
随机推荐
- 洛谷 P1926 小书童——刷题大军
题目背景 数学是火,点亮物理的灯:物理是灯,照亮化学的路:化学是路,通向生物的坑:生物是坑,埋葬学理的人. 文言是火,点亮历史宫灯:历史是灯,照亮社会之路:社会是路,通向哲学大坑:哲学是坑,埋葬文科生 ...
- codevs 3129 奶牛代理商IX
时间限制: 1 s 空间限制: 32000 KB 题目等级 : 白银 Silver 题目描述 Description 小X从美国回来后,成为了USACO中国区的奶牛销售代理商,专门出售质优价廉的“ ...
- 生鲜o2o配送应用系统,包括Android源码+SSH带后台管理系统
前台功能划分 我的 登录 账户+密码 注册 订单管理 查看/删除(显示订单详情) 支付(提交订单) ...
- Xcode4删除文件后missing file警告
1.运行终端,执行命令行进入missing file目录,然后运行 svn delete nameOfMissingFile 或 git rm nameOfMissingFile 2.删除隐藏的.sv ...
- LVM逻辑分区的优缺点与步骤
一.LVM简介 1. 什么是LVM? LVM是 Logical Volume Manager(逻辑卷管理)的简写 2. 为什么使用LVM? LVM通常用于装备大量磁盘的系统,但它同样适于仅有一.两块硬 ...
- Codeforces Round #277.5 (Div. 2)-D. Unbearable Controversy of Being
http://codeforces.com/problemset/problem/489/D D. Unbearable Controversy of Being time limit per tes ...
- vue for循环中常见问题 之 求和(合计)
例:求后台返回数据this.dataInfo 中某个字段(item.totalSum)的和,只需添加computed,然后模板中直接可以使用totalSumAll (不需要再data中声明) comp ...
- 拼凑json的实例
一,拼凑 json 串 并传到后台 function writeToJson(num){ var i = 1; var jsonData = "["; for(i=1;i< ...
- LeetCode 三角形最小路径和
给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和为 11 ...
- jenkins学习笔记(一)
windows下安装jenkins步骤 1.下载 官网路径:https://jenkins.io/ 2.安装 直接双击安装程序即可 centos7下安装命令: wget -O /etc/yum.rep ...