BZOJ 1996: [Hnoi2010]chorus 合唱队(区间dp)
题目:
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)的更多相关文章
- BZOJ 1996: [Hnoi2010]chorus 合唱队(dp)
简单的dp题..不能更水了.. --------------------------------------------------------------- #include<cstdio&g ...
- 【BZOJ1996】[Hnoi2010]chorus 合唱队 区间DP
[BZOJ1996][Hnoi2010]chorus 合唱队 Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Ou ...
- bzoj 1996: [Hnoi2010]chorus 合唱队
Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Source 因为只会在区间的两端进行 ...
- BZOJ1996:[HNOI2010]CHORUS 合唱队(区间DP)
Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Solution 辣鸡guide真难用 ...
- [HNOI2010]CHORUS 合唱队 (区间DP)
题目描述 对于一个包含 NN 个整数的数列 AA ,我们可以把它的所有元素加入一个双头队列 BB . 首先 A1A1 作为队列的唯一元素,然后依次加入 A2∼ANA2∼AN ,如果 Ai<Ai− ...
- 【BZOJ】1996: [Hnoi2010]chorus 合唱队【区间dp】
1996: [Hnoi2010]chorus 合唱队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2088 Solved: 1371[Submit][ ...
- 1996: [Hnoi2010]chorus 合唱队 - BZOJ
Description Input Output Sample Input41701 1702 1703 1704Sample Output8HINT 水题,区间dp,f[l,r,k]表示区间[l,r ...
- 【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. 状态设计: 考虑和关路灯一样设计状态 因为不知道当前这个区间是从哪个区间拓展而来,即不知道这个区间 ...
随机推荐
- Azure系列2.1.12 —— CloudBlobDirectory
(小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...
- Mybatis+Spring整合后Mapper测试类编写
public class UserMapperTest { private ApplicationContext applicationContext; @Before public void ini ...
- oss上传和下载的笔记
<<<<<<<<<对oss操作,上传文件>>>>>>>>>>>>>& ...
- VUE 处理文本框获焦点高亮
先贴例子代码 这里又三个div对应的三个input输入框 <!-- 登录的表单 --> <div class="input_group" :class=&quo ...
- python爬虫之scrapy的pipeline的使用
scrapy的pipeline是一个非常重要的模块,主要作用是将return的items写入到数据库.文件等持久化模块,下面我们就简单的了解一下pipelines的用法. 案例一: items池 cl ...
- layer弹层基本参数初尝试
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 莫烦theano学习自修第五天【定义神经层】
1. 代码如下: #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ import numpy as np import theano.tensor as T ...
- SQL 函数NULLIF、NULL、ISNULL、COALESCE、IIF
NULLIF函数 NULLIF(Expression1,Expression2):给定两个参数Expression1和Expression2,如果两个参数相等,则返回NULL:否则就返回第一个参数. ...
- oracle判断是否包含字符串的方法
首先想到的就是contains,contains用法如下: select * from students where contains(address, ‘beijing’) 但是,使用contai ...
- spring事务 将多个connection放到一个线程中
spring事务 将多个connection放到一个线程中