Description

从前有个括号序列 s,满足 |s| = m。你需要统计括号序列对 (p, q) 的数量。
其中 (p, q) 满足 |p| + |s| + |q| = n,且 p + s + q 是一个合法的括号序列。

Input

从文件 bracket.in 中读入数据。第一行两个正整数 n, m。
第二行一个长度为 m 的括号序列,表示 s。
 

Output

输出到文件 bracket.out 中。
输出一行一个整数,表示符合条件的 (p, q) 的数量对 10^9 + 7 取模的值。
 
 

Sample Input

【样例 1 输入】
4 1 (
【样例 2 输入】
4 4 (())
【样例 3 输入
4 3 (((

Sample Output

【样例 1 输出】
4
【样例 2 输出】
1
【样例 3 输出】
0

Data Constraint

对于 10% 的数据,n ≤ 20;
对于 25% 的数据,n ≤ 200;
对于另外 5% 的数据,n = m;
对于 55% 的数据,n − m ≤ 200;
对于 100% 的数据,1 ≤ m ≤ n ≤ 10^5, n − m ≤ 2000。

分析

设一个DP为f[i][j]表示q串长度为i时,左右括号之和(一个1一个-1)为j时的方案数,显然最终答案为f[i][j]*f[n-m-i][j+lenofs]的和

#pragma GCC optimize(2)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const long long P=1e9+7;
int n,m;
char c[100001];
int s[100001],mins;
long long f[2001][2002];int main() {freopen("bracket.in","r",stdin);freopen("bracket.out","w",stdout);scanf("%d%d",&n,&m);scanf("%s",c);int len=strlen(c);mins=2147483647;for (int i=1;i<=len;i++) {s[i]=s[i-1]+(c[i-1]=='('?1:-1);mins=min(mins,s[i]);}f[0][0]=1;for (int i=1;i<=n-m;i++)for (int j=0;j<=i;j++) {if (j) f[i][j]+=f[i-1][j-1];f[i][j]%=P;f[i][j]+=f[i-1][j+1];f[i][j]%=P;}long long ans=0; for (int i=0;i<=n-m;i++)for (int j=0;j<=i;j++)if (j+s[len]<=n-m&&j+mins>=0) ans=(ans+f[i][j]*f[n-m-i][j+s[len]]%P)%P;printf("%lld",ans);fclose(stdin);fclose(stdout);
}

View Code

转载于:https://www.cnblogs.com/mastervan/p/9466114.html

[DP]JZOJ 5804 简单的序列相关推荐

  1. [dp] Jzoj P5804 简单的序列

    Description 从前有个括号序列 s,满足 |s| = m.你需要统计括号序列对 (p, q) 的数量. 其中 (p, q) 满足 |p| + |s| + |q| = n,且 p + s + ...

  2. [JZOJ 5804] 简单的序列

    思路: 似乎和某次培训的题很像啊... 将左括号记为1,右括号记为-1,那么最终一定加和为0,然后再求最小前缀和. 用dp解决即可. #include <bits/stdc++.h> us ...

  3. NOIP模拟测试「简单的区间·简单的玄学·简单的填数·简单的序列」

    简单的区间 $update$ 终于$AC$了 找到$(sum[r]+sum[l](sum表示以中间点为基准的sum)-mx)\%k==0$的点 注意这里$sum$表示是以$mid$为基准点,(即$su ...

  4. DL之RNN:基于TF利用RNN实现简单的序列数据类型(DIY序列数据集)的二分类(线性序列随机序列)

    DL之RNN:基于TF利用RNN实现简单的序列数据类型(DIY序列数据集)的二分类(线性序列&随机序列) 目录 序列数据类型&输出结果 设计思路 序列数据类型&输出结果 1.t ...

  5. python如何判断列表是否为空_python简单判断序列是否为空的方法

    python简单判断序列是否为空的方法 本文实例讲述了python简单判断序列是否为空的方法.分享给大家供大家参考.具体如下: 假设有如下序列: m1 = [] m2 = () m3 = {} 判断他 ...

  6. [区间DP]JZOJ 3095 秘密文件

    Description 某天,情报局得到了一份秘密文件.文件的内容是加密后的全部由大写字母组成字符串.情报局局长小明想将其发送给远在东方神秘的XX大陆上的老朋友小刘来解密.然而若字符串太长,则需要很长 ...

  7. 简单DP【p2642】双子序列最大和

    Description 给定一个长度为n的整数序列,要求从中选出两个连续子序列,使得这两个连续子序列的序列和之和最大,最终只需输出最大和.一个连续子序列的和为该子序列中所有数之和.每个连续子序列的最小 ...

  8. 算法与数据结构-DP算法及简单实例

    1. 动态规划(DP)算法的基本原理 动态规划过程: 每次决策依赖于当前状态,随即又引起状态转移. 一个决策序列就是在变化的状态中产生的,这种多阶段最优化决策解决问题的过程就称为动态规划. DP求解问 ...

  9. Luo's oj P1916 简单的序列(bracket)

    传送门 分析 我们将左括号看作 1,右括号看作 -1,则一个合法的括号序列需要满足: *所有括号的总和为 0 *每个前缀和均不小于0 我们先统计出串 s 的总和 a 以及最小的前缀和 b,然后枚举串 ...

最新文章

  1. hive的新分区和旧分区的概念问题
  2. xcode-select: error: tool 'xcodebuild' requires Xcode错误解决方法
  3. mybatis配置文件加注释报错怎么办?改一笔就能帮你解决
  4. Netty工作笔记0005---NIO介绍说明
  5. Spring Cloud构建微服务架构:消息驱动的微服务(核心概念)【Dalston版】
  6. 用编程解决生活中的问题
  7. 重读你不知道的JS (上) 第一节五章
  8. 第七十三节,css盒模型
  9. 科目一知识点分类梳理
  10. 泛微OA流程中调用SAP接口
  11. 五个核心能力打造普惠金融商业化发展模式
  12. android系统架构,文件目录
  13. 学硬件好还是软件好?软件和硬件哪个更吃香?
  14. 22考研初试成绩公布时间
  15. Another Day 超好听的BGM
  16. 信阳师院计算机与信息技术学院,徐丽娟
  17. 毕设笔记01-解决树莓派烧写系统显示屏不显示问题
  18. 并查集——银河英雄传说()
  19. 【山外问道】什么是UUID
  20. 福州大学数学计算机学院,福州大学数学与计算机科学学院导师介绍:廖祥文

热门文章

  1. 最新Brave情侣主题模板源码+Typecho内核
  2. html如何提取素材,如何优雅地提取App的素材
  3. 【计算机算法】贪心算法——看电影、活动选择问题
  4. 1 1 2 3 5 8 13 21 代码实现 java(斐波那契数列)
  5. 愿为你破开鱼尾,但不会为你化身浮沫
  6. SuperMap iDesktop .NET 9D(2019)产品白皮书
  7. 正则表达式匹配 整数和正整数
  8. 51单片机DS1302实时时钟
  9. [PTA]实验5-3 使用函数求奇数和
  10. 2022软工K班结对编程作业