【BZOJ1996】【HNOI2010】合唱队 [区间DP]
合唱队
Time Limit: 4 Sec Memory Limit: 64 MB
[Submit][Status][Discuss]
Description

Input

Output

Sample Input
1701 1702 1703 1704
Sample Output
HINT

Main idea
给定一个元素两两不相等的目标序列,每次按照给定方式将一个元素加入到序列当中,问得到目标序列的方案有几种。(加元素的方式:如果加的这个元素比上一个加入的元素小的话则放在队头,否则放在队尾)。
Solution
发现题目要求的是方案数,并且没有什么一眼看过去的规律,不可能是找规律了,那么我们想到了区间DP。
由于题目给定的加入元素的方式,我们可以清楚的知道新元素要么加在队头要么加在队尾,所以说在某种程度上这个序列是连续的(或者说有特殊的性质),并且对于新加入的元素的位置的影响只跟上一次的加入元素有关。
根据这个特殊性质我们想到了区间DP,令f[l][r][0\1]表示区间l~r中现在加入的元素放在队头\队尾。
那么显然,初值即为f[i][i][0]=1或f[i][i][1]=1,并且如果放在队头的话f[l][r][0]应该从f[l+1][r][0\1]推导过来,继续思考发现从f[l+1][r][0]推导过来的条件是a[l]<a[l+1],从f[l][r][1]推导过来的条件则应该是a[l]<a[r],f[l][r][1]情况类似。
这样跑一遍区间DP最后答案显然就是f[1][n][0]+f[1][n][1]了。
Code
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<queue>
using namespace std; const int ONE=;
const int MOD=; int n;
int a[ONE];
int f[ONE][ONE][]; int get()
{
int res,Q=; char c;
while( (c=getchar())< || c>)
if(c=='-')Q=-;
if(Q) res=c-;
while((c=getchar())>= && c<=)
res=res*+c-;
return res*Q;
} int main()
{
n=get();
for(int i=;i<=n;i++)
{
a[i]=get();
} for(int i=;i<=n;i++) f[i][i][]=; for(int l=n;l>=;l--)
for(int r=l+;r<=n;r++)
{
f[l][r][]=( f[l][r][] + f[l+][r][] * (a[l]<a[l+]) ) % MOD;
f[l][r][]=( f[l][r][] + f[l+][r][] * (a[l]<a[r]) ) % MOD;
f[l][r][]=( f[l][r][] + f[l][r-][] * (a[r]>a[l]) ) % MOD;
f[l][r][]=( f[l][r][] + f[l][r-][] * (a[r]>a[r-]) ) % MOD;
} printf("%d",(f[][n][]+f[][n][]) % MOD);
}
【BZOJ1996】【HNOI2010】合唱队 [区间DP]的更多相关文章
- P3205 [HNOI2010]合唱队[区间dp]
题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为Hi米(1000<=Hi<= ...
- [HNOI2010]合唱队 区间DP
---题面--- 题解: 偶然翻到这道题,,,就写了. 观察到一个数被插在哪里只受前一个数的影响,如果明确了前一个数是哪个,那么我们就可以确定大小关系,就可以知道当前这个数插在哪里,而上一个插入的数就 ...
- BZOJ1996:[HNOI2010]CHORUS 合唱队(区间DP)
Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Solution 辣鸡guide真难用 ...
- LG3205/BZOJ1996 「HNOI2010」合唱队 区间DP
区间DP 区间DP: 显然是一个区间向左右拓展形成的下一个区间,具有包含关系,所以可以使用区间DP. 状态设计: 考虑和关路灯一样设计状态 因为不知道当前这个区间是从哪个区间拓展而来,即不知道这个区间 ...
- [HNOI2010]CHORUS 合唱队 (区间DP)
题目描述 对于一个包含 NN 个整数的数列 AA ,我们可以把它的所有元素加入一个双头队列 BB . 首先 A1A1 作为队列的唯一元素,然后依次加入 A2∼ANA2∼AN ,如果 Ai<Ai− ...
- 【BZOJ1996】[Hnoi2010]chorus 合唱队 区间DP
[BZOJ1996][Hnoi2010]chorus 合唱队 Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Ou ...
- BZOJ1996 HNOI2010合唱队(区间dp)
设f[i][j][0/1]表示i~j这段区间上一次选择的是最左/最右人的方案数.转移显然. #include<iostream> #include<cstdio> #inclu ...
- BZOJ1996 合唱队 区间DP
OJ地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1996 设dp(i,j,k)代表在理想结果中[i,j]段最后添加的是i或j(k=0or1) ...
- 洛谷P3205合唱队——区间DP
题目:https://www.luogu.org/problemnew/show/P3205 枚举点,分类为上一个区间的左端点或右端点,满足条件便+=即可: 注意不要重复(当l=2时). 代码如下: ...
随机推荐
- Linq To Excel使用简介二
目录: 1.常用方法介绍 2.查询符合条件的数据 3.手动添加映射 4.其他用法 1.常用方法介绍 里面有一些常见的方法,如下: Worksheet 获得工作表中的数据 Works ...
- Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)
作者:Antonio Leiva 时间:Mar 21, 2017 原文链接:https://antonioleiva.com/operator-overload-kotlin/ 就像其他每种语言一样, ...
- CSP201403-1:相反数
引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的“计算机职业资格认证”考试,针对计算机软件开发. ...
- Visual Studio Code 配置Go 开发环境最简单的方法!!!
由于大家都知道的原因,在国内如果想访问go等各种资源,都会遇到某种不可预知的神奇问题.导致在VS Code中安装 go 各种插件都会失败. 于是乎,网上就出现了各种各样的解决方案:什么手动git cl ...
- 1087 All Roads Lead to Rome (30 分)(最短路径)
直接用Dijkstra做 #include<bits/stdc++.h> using namespace std; int n,m; map<string,int>si; ma ...
- SQL 基础笔记(三):约束
个人笔记不保证正确. 数据类型是限制我们可以在表里存储什么数据的一种方法.不过,对于许多应用来说, 这种限制实在是太粗糙了.比如,一个包含产品价格的字段应该只接受正数. 但是没有哪种标准数据类型只接受 ...
- uva 116 Unidirectional TSP(动态规划,多段图上的最短路)
这道题目并不是很难理解,题目大意就是求从第一列到最后一列的一个字典序最小的最短路,要求不仅输出最短路长度,还要输出字典序最小的路径. 这道题可以利用动态规划求解.状态定义为: cost[i][j] = ...
- 软工实践Beta冲刺(2/7)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 1.界面的修改与完善 展示GitHub当日代码/文档签入记 ...
- 编程练习:寻找发帖"水王"扩展问题一
回顾 寻找发帖水王的问题总结起来就是在一个数组中某一个元素出现次数超过了数组长度的一半,那么可以很顺利的找到这个元素,实现见"编程练习:寻找发帖水王" 扩展 上面的问题中,强调了某 ...
- vue-cli项目里npm安装font-awesome
第一步:进入到项目目录里,运行 cnpm i font-awesome -s 第二步:在main.js里面 import 'font-awesome/css/font-awesome.min.css'