1996: [Hnoi2010]chorus 合唱队
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1996
Description

Input

Output

Sample Input
1701 1702 1703 1704
Sample Output
HINT
题解:还是一个区间动归,可是这道题的问题在于比较难想到怎么去设,我们会发现每次放一个数时我们都会
考虑放在左边还是放在右边,实际上最后数放在左边还是右边的方案数是不同的,所以我们除了枚举区间,还要枚举当前这个数是放在了左边还是放在了右边,先来结合动态转移方程看一看:
if (a[j]>a[i]) f[i][j][1]+=f[i][j-1][0];
if (a[j]>a[j-1]) f[i][j][1]+=f[i][j-1][1];
if (a[i]<a[j]) f[i][j][0]+=f[i+1][j][1];
if (a[i]<a[i+1]) f[i][j][0]+=f[i+1][j][0];
(是不是看着觉得很莫名其妙?别急,解释一下。)我们用f[i][j][0]表示构成区间i~j有多少种可能,且这个区间最后一个被放进的数存在最左边,即i处,同理,f[i][j][1]表示最后一个被放进的数存在最右边,即j处。a数组则用来存储这个队列。
先来看第一个式子
if (a[j]>a[i]) f[i][j][1]+=f[i][j-1][0];这个式子的意思是,我们设当前i~j区间最后一个数放在了最右边即a[j],则上一个区间为f[i][j-1],我们又设上一次区间的最后一个数放在了f[i][j-1]的左边即a[i],那么上一次的方案数即为f[i][j-1][0],我们判断这种方案成立的方法即为如果这次的这个数被放在了最右边,那么它是大于上一次的数,即a[j]需大于a[i],如果大于,那么这种方案就成立,就可以加上这种方案数。如图:
这么左右左右去枚举一下总共有四种可能,这就是为什么上面有四个方程式。
具体看程序吧:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int ans,n,j,a[],f[][][];//我刚开始数组没开对,调了很久,最后一个一定要设为2而不是1;
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
memset(f,,sizeof(f));
for (int i=;i<=n;i++) f[i][i][]=;//刚开始构成单个的方案数皆为一
for (int len=;len<=n;len++)//枚举长度
for (int i=;i<=n-len+;i++)
//这两句for循环其实等同于
for (int i=n;i>=;i--)
for (int j=i;j<=n;j++)
{
j=i+len-;
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[j]) f[i][j][]+=f[i+][j][];
if (a[i]<a[i+]) f[i][j][]+=f[i+][j][];//之前解释过的动态转移方程
f[i][j][]%=;
f[i][j][]%=;//题目要求
}
ans=(f[][n][]+f[][n][])%;//答案是左右之和
printf("%d\n",ans);
return ;
}
(咳咳,我看了半天人家的题解)
1996: [Hnoi2010]chorus 合唱队的更多相关文章
- BZOJ 1996: [Hnoi2010]chorus 合唱队(dp)
简单的dp题..不能更水了.. --------------------------------------------------------------- #include<cstdio&g ...
- 【BZOJ】1996: [Hnoi2010]chorus 合唱队【区间dp】
1996: [Hnoi2010]chorus 合唱队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2088 Solved: 1371[Submit][ ...
- bzoj 1996: [Hnoi2010]chorus 合唱队
Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Source 因为只会在区间的两端进行 ...
- BZOJ 1996: [Hnoi2010]chorus 合唱队(区间dp)
题目: https://www.lydsy.com/JudgeOnline/problem.php?id=1996 题解: 这题刚拿到手的时候一脸懵逼qwq,经过思考与分析(看题解),发现是一道区间d ...
- 1996: [Hnoi2010]chorus 合唱队 - BZOJ
Description Input Output Sample Input41701 1702 1703 1704Sample Output8HINT 水题,区间dp,f[l,r,k]表示区间[l,r ...
- 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 ...
- 【BZOJ1996】[Hnoi2010]chorus 合唱队 区间DP
[BZOJ1996][Hnoi2010]chorus 合唱队 Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Ou ...
- BZOJ1996 [Hnoi2010]chorus 合唱队
很容易想到区间DP 然后发现这个区间只和圆序列的最后一个数有关,而原序列的最后一个数只可能是现在区间的头或者尾 令$f[i][j][0/1]$表示在区间$[i, j]$之间,原序列的最后一个数是当前区 ...
随机推荐
- Google V8编程详解(五)JS调用C++
http://blog.csdn.net/feiyinzilgd/article/details/8453230 最近由于忙着解决个人单身的问题,时隔这么久才更新第五章. 上一章主要讲了Google ...
- 忘记密码流程——UUID,AES
忘记密码流程 1.进入忘记密码页面 2. 后台检验参数合法性(null,验证码,邮箱合法性) 3,生成更新密码链接,并将相关参数写入DB link=urlBase(baseurl)+updatePas ...
- IIS发布项目 遇到的error
HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容. 重新注册一下.net framework试试,当然这一步骤也可以排在第一位. 32位的Windows: ...
- [测]jieba分词
import jieba import os import jieba.analyse with open('src.txt', 'r') as file: data = file.read() se ...
- jsp js action之间的传值
1.struts2 action如何向JSP的JS函数传值 action中定义变量public class TestAction extends ActionSupport implements Se ...
- java 基本语法
标识符 标识符就是给变量.类或方法起的名字. 标识符由26个英文字符大小写(a~zA~Z).数字(0~9).下划线(_)和美元符号($)组成 不能以数字开头,不能是关键字 严格区分大小写 标识符的可以 ...
- inline-内联函数的优点以及与宏定义的区别
inline函数的优点: C++ 语言的函数内联机制既具备宏代码的效率,又增加了安全性,而且可以自由操作类的数据成员.所以在C++ 程序中,应该用内联函数取代所有宏代码. inline函数与宏定义的区 ...
- [原创]迈出NIOS的第一步,HelloNIOS
Altera官方推出NIOS已经很久了,个人感觉C+V代码配合会是后面FPGA使用的一个主流,由C来完成一些对时序要求不高,对功能要求偏高的部分,比如运动控制等:由V来配合时序完成高时序要求的需求以及 ...
- js 遇到问题
1)obj.style.attr 和obj.style[attr]区别: 2)window.onload一个页面只能出现一次: 3)border-radious实现 实心和空心圆 要点:宽度高度一样大 ...
- Numpy Python
如果一个数组太长,则NumPy自动省略中间部分而只打印两端的数据: 可通过设置printoptions参数来禁用NumPy的这种行为并强制打印整个数组. set_printoptions(thresh ...