题目:

  https://www.lydsy.com/JudgeOnline/problem.php?id=1996

题解:

  这题刚拿到手的时候一脸懵逼qwq,经过思考与分析(看题解),发现是一道区间dp

  首先我们考虑最终数列的形成过程,可以看做是由一个序列向左右不断加数形成的,因此,就有一个很美妙的性质:对于最终序列的任意一段,最后加入的一定是左端点或者右端点(很显然)。因此我们就考虑到了区间dp。。

  最终序列为g,定义dp[i][j][k](k==0||k==1)表示对于最终序列的i-j区间,最后加入的是左端点(g[i])(k==0),还是右端点(g[j])(k==1)。

  那么dp方程就很显然了,对于dp[i][j][1](此数放在右边),最后加入的数(g[j])一定比倒数第二个大

    (1)倒数第二个数放在了左边,那么if(g[j]>g[i]) dp[i][j][1]+=dp[i][j-1][0];

    (2)倒数第二个数放在了右边,那么if(g[j]>g[j-1]) dp[i][j][1]+=dp[i][j-1][1];

  对于dp[i][j][0]同理。。。

  区间dp最外层枚举区间长度。。(这是一句废话qwq)

  p.s.对于初始化时dp[i][i][0/1]只能将0/1其中的一个置成1,否则会导致重复计数。

代码:

#include<bits/stdc++.h>

using namespace std;

const int p=;
const int maxn=;
int dp[maxn][maxn][],g[maxn],n; int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&g[i]);
for(int i=;i<=n;i++)
dp[i][i][]=;
for(int k=;k<=n;k++)
for(int i=,j=i+k-;j<=n;j++,i++){
if(g[j]>g[i]) dp[i][j][]+=dp[i][j-][];
if(g[j]>g[j-]) dp[i][j][]+=dp[i][j-][];
if(g[i]<g[j]) dp[i][j][]+=dp[i+][j][];
if(g[i]<g[i+]) dp[i][j][]+=dp[i+][j][];
dp[i][j][]%=p,dp[i][j][]%=p;
}
printf("%d",(dp[][n][]+dp[][n][])%p);
return ;
}

BZOJ 1996: [Hnoi2010]chorus 合唱队(区间dp)的更多相关文章

  1. BZOJ 1996: [Hnoi2010]chorus 合唱队(dp)

    简单的dp题..不能更水了.. --------------------------------------------------------------- #include<cstdio&g ...

  2. 【BZOJ1996】[Hnoi2010]chorus 合唱队 区间DP

    [BZOJ1996][Hnoi2010]chorus 合唱队 Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Ou ...

  3. bzoj 1996: [Hnoi2010]chorus 合唱队

    Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Source 因为只会在区间的两端进行 ...

  4. BZOJ1996:[HNOI2010]CHORUS 合唱队(区间DP)

    Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Solution 辣鸡guide真难用 ...

  5. [HNOI2010]CHORUS 合唱队 (区间DP)

    题目描述 对于一个包含 NN 个整数的数列 AA ,我们可以把它的所有元素加入一个双头队列 BB . 首先 A1A1 作为队列的唯一元素,然后依次加入 A2∼ANA2∼AN ,如果 Ai<Ai− ...

  6. 【BZOJ】1996: [Hnoi2010]chorus 合唱队【区间dp】

    1996: [Hnoi2010]chorus 合唱队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2088  Solved: 1371[Submit][ ...

  7. 1996: [Hnoi2010]chorus 合唱队 - BZOJ

    Description Input Output Sample Input41701 1702 1703 1704Sample Output8HINT 水题,区间dp,f[l,r,k]表示区间[l,r ...

  8. 【BZOJ1996】【HNOI2010】合唱队 [区间DP]

    合唱队 Time Limit: 4 Sec  Memory Limit: 64 MB[Submit][Status][Discuss] Description Input Output Sample ...

  9. LG3205/BZOJ1996 「HNOI2010」合唱队 区间DP

    区间DP 区间DP: 显然是一个区间向左右拓展形成的下一个区间,具有包含关系,所以可以使用区间DP. 状态设计: 考虑和关路灯一样设计状态 因为不知道当前这个区间是从哪个区间拓展而来,即不知道这个区间 ...

随机推荐

  1. Day 5-7 exec 和元类的创建.

    exec方法 元类 exec(str_command,globals,locals)参数1:字符串形式的命令参数2:全局作用域(字典形式). 如果不指定,默认globals参数3:局部作用(字典形式) ...

  2. C# Note18: 使用wpf制作about dialog(关于对话框)

    前言 基本上任何software或application都会在help菜单中,有着一个关于对话框,介绍产品的版权.版本等信息,还有就是对第三方的引用(add author credits). 首先,看 ...

  3. checkbox保存和赋值

    //货物信息中的表格内容 $.each(trG.find('td input,td select'),function(i,inp){ if($(inp).attr('type')=='checkbo ...

  4. Codeforces 1154E Two Teams

    题目链接:http://codeforces.com/problemset/problem/1154/E 题目大意: 有n个队员,编号1~n,每个人的能力各自对应1~n中的一个数,每个人的能力都不相同 ...

  5. python学习笔记(5-1)-基本数据类型-字符串类型及操作

    五.字符串处理函数  len(x):字符串x的长度.如len("12345")结果为5  str(x):任意类型x所对应的字符串形式. >>> str(123) ...

  6. 在编写wpf界面时候中出现如下错误: 类型引用不明确。至少有两个名称空间(“System.Windows”和“System.Windows”)中已出现名为“VisualStateManager”的类型。请考虑调整程序集 XmlnsDefinition 特性。

    wpf中类型引用不明确.至少有两个名称空间(“System.Windows”和“System.Windows”)中已出现名为“VisualState 你是不是用了WPFToolKit?如果是的,那原因 ...

  7. Java多线程6:Synchronized锁代码块(this和任意对象)

    一.Synchronized(this)锁代码块 用关键字synchronized修饰方法在有些情况下是有弊端的,若是执行该方法所需的时间比较长,线程1执行该方法的时候,线程2就必须等待.这种情况下就 ...

  8. How to install Arch Linux

    fdisk -l mkfs.ext4 /dev/sdaX mount /dev/sdaX /mnt mkdir -p /mnt/boot/ mount /dev/sdaY /mnt/boot/ arc ...

  9. linux利用CMakeLists编译cuda程序

    文件目录: cudaTest |--utils.cu |--utils.h |--squaresum.cu |--squaresum.h |--test.cpp |--CMakeLists.txt 编 ...

  10. 当使用cokie进行数据交互时候,cookie只需存储该对象的id即可不需要存放其他数据;只需在写个接口根据cookie里面的对象id来创建对象

    当使用cokie进行数据交互时候,cookie只需存储该对象的id即可不需要存放其他数据:只需在写个接口根据cookie里面的对象id来创建对象