蓝桥杯省赛2021 括号序列 python

2023-11-11

给定一个括号序列,要求尽可能少地添加若干括号使得括号序列变得合法,当添加完成后,会产生不同的添加结果,请问有多少种本质不同的添加结果。

两个结果是本质不同的是指存在某个位置一个结果是左括号,而另一个是右括号。

例如,对于括号序列 (((),只需要添加两个括号就能让其合法,有以下几种不同的添加结果:()()()()()()、()(())()(())、(())()(())()、(()())(()()) 和 ((()))((()))​。

输入描述

输入一行包含一个字符串 s,表示给定的括号序列,序列中只有左括号和右括号。

输出描述

输出一个整数表示答案,答案可能很大,请输出答案除以 10000000071000000007 (即 10^9 + 7) 的余数。

输入输出样例

示例 1

输入

((()

输出

5

step1

我们将左括号的值看作 1,右括号的值看作 -1。

定义 sum[i]表示前 i个括号的和,n 表示序列的长度,那么对于一个合法序列,其必定满∀i∈(1,n),sum[i]≥0 且 sum[n] = 0。

step2

我们需要将添加括号使得原括号序列成为合法括号序列。

题目要尽可能少的添加括号,所以我们添加的左括号必然只能和原序列中的右括号匹配;我们添加的右括号必然只能和原序列中的左括号匹配。若我们添加的左括号和我们添加的右括号匹配了,那么它们无疑是一对没有意义的添加。

于是添加的左括号的方案只和原序列中的右括号相关,添加的右括号的方案只和原序列中的左括号相关,所以左右括号的添加是相互独立的。设左括号的添加方案为 f1,右括号的添加方案为 f2,那么显然最后的答案就是f1×f2。

step3

我们先考虑左括号的添加方案数。

设原序列中有 cnt 个右括号,我们以原序列中的右括号为分界点,那么一共可以划分出 cnt+1个区域。我们只能在第  cnt1∼cnt 个区域添加左括号,因为若是在第 cnt+1 区域添加左括号,将不会有右括号可以与它匹配。

定义 dp[i][j] 表示前 i个区域(右括号),在我们添加了若干个左括号后一共有 j个左括号的方案数。对于两个不同的方案,它们至少有一个区域添加的左括号的个数不相同,于是可得:

dp[i][j]=dp[i−1][j]+dp[i−1][j-1]+dp[i−1][j-2]+⋯+dp[i−1][0]

前缀优化

dp[i][j-1]=dp[i-1][j]+dp[i-1][j-1]+·····+dp[i-1][0]

dp[i][j]=dp[i][j-1]+dp[i-1][j+1]

思路:

从左向右是左括号的填空,左括号只能加在右括号的前面的n个位置

s=input()
n=len(s)
mod=1000000007
N=n+5
dp=[[0 for i in range(N)]for j in range(N)]
def calc():
     dp[0][0]=1
     for i in range(1,n+1):
          if s[i-1]=="(":
               for j in range(1,n+1):
                    dp[i][j]=dp[i-1][j-1]%mod
          else:
               dp[i][0]=(dp[i-1][1]+dp[i-1][0])%mod
               for j in range(1,n+1):
                    dp[i][j]=(dp[i-1][j+1]+dp[i][j-1])%mod
     for i in range(n+1):
          if dp[n][i]!=0:
               return dp[n][i]
     return -1
left=int(calc())
a=list(s[::-1])
for i in range(n):
     if a[i]==")":
          a[i]="("
     else:
          a[i]=")"
s=''.join(a)
right=calc()
print((left*right)%mod)

import os
import sys

S = input()
dp = [[0 for i in range(5010)] for i in range(5010)]
mod = 1000000007


def calc(cnt, flag, S):
    pre = [0] * 5010
    nex = [0] * 5010
    sum = [0] * 5010
    s = S
    if cnt == 0:
        return 1
    if not flag:
        s = list(S[::-1])
        i = 0
        while i < len(s):
            if s[i] == ')':
                s[i] = '('
            else:
                s[i] = ')'
            i += 1
    n = 0
    now = 0
    i = 0
    while i < len(s):
        if s[i] == ')':
            n += 1
            sum[n] = now
        if s[i] == '(':
            now += 1
        i += 1
    if sum[1] > 0:
        dp[1][0] = 1
        pre[0] = 1
    i = 1
    while i <= cnt:
        dp[1][i] = 1
        pre[i] = pre[i - 1] + 1
        i += 1
    i = 2
    while i <= n:
        j = 0
        while j <= cnt:
            nex[j] = 0
            j += 1
        j = i - sum[i]
        while j <= cnt:
            dp[i][j] = pre[j]
            nex[j] = int((nex[j - 1] + dp[i][j]) % mod)
            j += 1
        j = 0
        while j <= cnt:
            pre[j] = nex[j]
            j += 1
        i += 1
    return dp[n][cnt]


tot = 0
cnt1 = 0
cnt2 = 0
for i in S:
    if i == '(':
        tot += 1
    else:
        tot -= 1
    if tot < 0:
        tot = 0
        cnt1 += 1
cnt2 = tot
print(calc(cnt1, True, S) * calc(cnt2, False, S) % mod)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝桥杯省赛2021 括号序列 python 的相关文章

  • 车载测试ADAS-常用场景仿真软件

    2024软件测试面试刷题 这个小程序 永久刷题 靠它快速找到工作了 刷题APP的天花板 CSDN博客 文章浏览阅读1 9k次 点赞85次 收藏11次 你知不知道有这么一个软件测试面试的刷题小程序 里面包含了面试常问的软件测试基础题 web自
  • Flutter完整开发实战详解(一、Dart语言和Flutter基础)

    前言 在如今的 Fultter 大潮下 本系列是让你看完会安心的文章 本系列将完整讲述 如何快速从0开发一个完整的 Flutter APP 配套高完成度 Flutter 开源项目 GSYGithubAppFlutter 同时也会提供一些Fl
  • 配音工具哪个好?这里有你想知道的答案

    听说你还在为找不到合适的配音工具而烦恼 没关系 我这就来给你支招 其实配音不一定得找专业的录音室 现在许多在线工具也可以帮助你将文字转化为语音 而且 互联网上的配音工具可不少呢 有的可以提供多种语音风格和语调 有的则是可以快速生成语音内容
  • 开发基于序列到序列模型的语音识别系统

    语音识别系统是一种人工智能技术 可以将人类的口语语音转换为可读的文本格式 近年来 随着深度学习技术的不断发展和进步 基于序列到序列模型的语音识别系统逐渐成为了最受欢迎的技术之一 本文将介绍如何利用这种技术开发出高效 准确的语音识别系统 并探
  • 利用强化学习训练自适应对话系统

    随着人工智能的发展 对话系统成为了人机交互的重要组成部分 传统的对话系统常常基于规则或模板 缺乏灵活性和自适应性 而利用强化学习来训练自适应对话系统 则可以使系统具备更好的对话能力和智能化水平 本文将介绍利用强化学习训练自适应对话系统的方法
  • 为什么要编写测试用例,测试用例写给谁看?

    为什么要编写测试用例 测试用例写给谁看 这个问题看似简单 但却涵盖了一系列复杂的考虑因素 并不太好回答 为了向各位学测试的同学们解释清楚 为什么编写测试用例是至关重要的 我将通过以下5个方面进行展开 1 为什么要写测试用例 2 测试用例写给
  • 为什么要编写测试用例,测试用例写给谁看?

    为什么要编写测试用例 测试用例写给谁看 这个问题看似简单 但却涵盖了一系列复杂的考虑因素 并不太好回答 为了向各位学测试的同学们解释清楚 为什么编写测试用例是至关重要的 我将通过以下5个方面进行展开 1 为什么要写测试用例 2 测试用例写给
  • LeetCode:162. 寻找峰值、1901. 寻找峰值 II(二分 C++)

    目录 162 寻找峰值 题目描述 实现代码与解析 二分 原理思路 1901 寻找峰值 II 题目描述 实现代码与解析 二分 原理思路 162 寻找峰值 题目描述 峰值元素是指其值严格大于左右相邻值的元素 给你一个整数数组 nums 找到峰值
  • Zoho Mail:1600万企业用户的信赖之选

    Zoho Mail和Workplace在线办公套件一起 已经成长为一个集邮箱 即时通讯 生产力工具于一身的非常全面的强大平台 经过数十年持续深入的研发投入 我们的产品可以很好地服务大型企业 这是Zoho创始人斯瑞达 温布在Zoho Mail
  • CSSTree:CSS解析与转换的强大工具集

    CSS作为前端开发中不可或缺的一部分 负责网页的样式和布局 但处理CSS的复杂性常常让开发者感到头疼 为了解决这个问题 CSSTree应运而生 CSSTree是一个基于规范和浏览器实现的工具集 旨在提供快速 详细的CSS解析器 CSS AS
  • 判断完全数-第11届蓝桥杯省赛Python真题精选

    导读 超平老师的Scratch蓝桥杯真题解读系列在推出之后 受到了广大老师和家长的好评 非常感谢各位的认可和厚爱 作为回馈 超平老师计划推出 Python 蓝桥杯真题解析100讲 这是解读系列的第27讲 判断完全数 本题是2020年6月20
  • 如何查看崩溃日志

    目录 描述 思路 查看ipa包崩溃日志 简单查看手机崩溃信息几种方式 方式1 手机设置查看崩溃日志 方式2 Xocde工具 方式3 第三方软件克魔助手 环境配置 实时日志 奔溃日志分析 方式四 控制台资源库 线上崩溃日志 线上监听crash
  • 软件测试基础知识与面试理论总结(答案+文档)

    一 什么是软件 软件是计算机系统中的程序和相关文件或文档的总称 二 什么是软件测试 说法一 使用人工或自动的手段来运行或测量软件系统的过程 以检验软件系统是否满足规定的要求 并找出与预期结果之间的差异 说法二 软件测试就是利用一定的方法对软
  • 外包干了2个月,技术退步明显...

    先说一下自己的情况 大专生 18年通过校招进入武汉某软件公司 干了接近4年的功能测试 今年年初 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了2年的女朋友
  • OpenHarmony基于HDF简单驱动开发实例

    背景 OpenHarmony 3 0 LTS qemu small system demo liteos a qemu 添加配置 device qemu arm virt liteos a hdf config device info de
  • 外包干了2个月,技术退步明显...

    先说一下自己的情况 大专生 18年通过校招进入武汉某软件公司 干了接近4年的功能测试 今年年初 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了2年的女朋友
  • 做好这几件事,30岁的你也能转行鸿蒙(HarmonyOS)?

    当你年过30 不管你愿不愿意承认 你的精力都在走下坡路 25岁熬一个通宵能写出来的代码 30岁有可能需要一整天 当然你也可以选择不拼精力和体力 当自身的一线经验积累到一定程度后 就会选择慢慢过渡到管理者的角色 通过经验分享及任务分配来参与项
  • Android Navigation的四大要点你都知道吗?

    在JetPack中有一个组件是Navigation 顾名思义它是一个页面导航组件 相对于其他的第三方导航 不同的是它是专门为Fragment的页面管理所设计的 它对于单个Activity的App来说非常有用 因为以一个Activity为架构
  • 『力扣刷题本』:逆波兰表达式求值

    大家好久不昂 最近 1 个多月罗根一直在备考期末 文章发的很少 现在已经放寒假啦 学习自然也不能拉下 毕竟 4 月份就要去参加蓝桥杯了 先给自己定个小目标 日更 2 篇 咳咳 下面马上开始讲题 一 题目 给你一个字符串数组 tokens 表
  • 15:00面试,15:06就出来了,问的问题有点变态。。。

    从小厂出来 没想到在另一家公司又寄了 到这家公司开始上班 加班是每天必不可少的 看在钱给的比较多的份上 就不太计较了 没想到9月一纸通知 所有人不准加班 加班费不仅没有了 薪资还要降40 这下搞的饭都吃不起了 还在有个朋友内推我去了一家互联

随机推荐

  • 手机端font-size:31.25vw原理

    移动端布局一般使用 方法一 媒体查询 rem 弹性盒子布局 方法二 vw rem 弹性盒子布局 这里说一下vw原理 vw它是根据可视区的宽度来计算的 如果是10vw 就是当前移动设备 浏览器 宽度的十分之一大小 vw 视窗宽度的百分比 1v
  • java集群

    转载 http blog csdn net happyangelling article details 6413584 序言 越来越多的关键应用运行在J2EE Java 2 Enterprise Edition 中 这些诸如银行系统和账单
  • Oracle快速入门(1)——ORACLE数据库简介

    一 什么是ORACLE ORACLE数据库系统是美国ORACLE公司 甲骨文 提供的以分布式数据库为核心的一组软件产品 是目前最流行的客户 服务器 CLIENT SERVER 或B S体系结构的数据库之一 ORACLE通常应用于大型系统的数
  • 编译boost提示错误:LINK : fatal error LNK1104: 无法打开文件“libboost_filesystem-vc100-mt-gd-1_64.lib”

    在Visual Studio 2010下编译出现如下错误 1 gt LINK fatal error LNK1104 cannot open file libboost system vc100 mt gd 1 64 lib 1 gt 1
  • pytorch安装报错:ERROR: torch has an invalid wheel, .dist-info directory not found

    在windows10 anaconda创建虚拟环境后 安装pytorch 运行pip install r requirement txt安装torch时报错 ERROR torch has an invalid wheel dist inf
  • NLP预训练模型系列-GPT-2

    NLP预训练模型 系列文章目录 1 BERT 2 GPT 3 GPT 2 4 GPT 3 目录 NLP预训练模型系列文章目录 前言 1 Abstract 2 Introduction 3 Approach 3 1 Training Data
  • 科大奥锐密立根油滴实验数据_密立根油滴实验数据处理

    刘秋君 回答于 2017 03 05 密立根油滴实验报告 实验题目 密立根油滴实验 电子电荷的测量 实验目的 1 通过对带电油滴在重力场和静电场中运动的测量 验证电荷的不连续性 并测定电子电荷的电荷值e 2 通过实验过程中 对仪器的调整 油
  • Python Wind量化API

    文章目录 导入 代码生成器 各个函数 wds 日期序列函数 wss多维数据函数 wset数据集函数 wsee wses swq 实时行情数据 wsi 获取分钟级别数据 wst 日内 edb 宏观数据 日期函数 tdays ddaysoffs
  • 【page分页工具类】贼好用的分页工具类

    PageUtils工具类如下 package utils import java io Serializable import java util HashMap import java util List import java util
  • QT学习笔记(四)信号槽与简单的自定义信号

    1 坐标系 左上角为零点 x向右为正方向 y向下为正方形 2 信号 完成连接connect的过程包括以下内容 信号的发送 信号发送的具体内容 信号的接受 信号的处理 称为槽函数 3 信号槽 信号槽的优点 松散耦合 信号的发送方和接受方本身没
  • 使用navicat为数据表添加外键

    1 选择需要操作的表 打开设计表 点击外键 2 名 自动生成 无需添加 字段 选择需要添加外键的字段 参考模式 选择表所在的数据库 参考表 关联表名 参考字段 关联表的关联字段 删除时 当删除关联表时 set null该字段置空 更新时 当
  • 【子比主题】添加今日实时热搜榜单教程

    预览图 演示地址 实时热榜 淇云博客 专注于IT技术分享 使用教程 首页版 将下载文件中的 index php 里的内容复制到 wp content themes zibll index php 里你想要放置的地方 Tips 不止index
  • 我爱说英语之学美语发音

    开篇 在写这篇文章之前 我考虑了很久 思前想后 还是决定把她写成一个系列的文章 用以来见证我们学习英语的历程 同时也为了说明我要学好英语的决心 废话不多说 进入正题 回忆 对于我们这些已经毕业很久的人来说 不知道还算不算有英语基础 最起码在
  • 狂野飙车9服务器维护中,狂野飙车9传奇进不去怎么办

    狂野飙车9 国际服IOS进入办法 苹果端的小伙伴如果想要进入 狂野飙车9 的国际服应该怎么办呢 下面 就跟随玩游戏网的小编一起来看一下具体的进入办法吧 感兴趣的小伙伴可千万不要错过哦 进入方法 第一步 首先我们需要推出AppStore账号
  • 魔方机器人之结构篇

    魔方颜色识别和魔方复原算法以及串口通信都解决完了 感觉自己该松口气了吧 结构可以反正仿照别人的来嘛 做出来就的了 事实又打了我一耳光 我怎么发现我的预判总是那么的不靠谱 总结就是自己没做过的东西再也不要说很简单了 即使看上去简单的再也不能简
  • 5-8 以特殊方式跟管理员打招呼

    创建一个至少包含5个用户名的列表 且其中一个用户名为 admin 想象你要编写代码 在每位用户登录网站后都打印一条问候消息 遍历用户名列表 并向每位用户打印一条问候消息 如果用户名为 admin 就打印一条特殊的问候消息 如 Hello a
  • 使用EasyExcel实现导入导出功能

    使用EasyExcel实现导入导出功能 一 导出 1 使用ideal新建一个maven项目 并在pom xml文件中引入EasyExcel依赖
  • impala 错误

    问题一 impala state store unrecognized service 原因 当前节点未成功安装impala server impala state store impala catalog 解决方案 yum install
  • ulua源码分析

    对于NestClass的Type 用了2次被Cache了两次 主要是因为PushType这个函数 对每个Type对象 不进行Cache检测 总是push一个新的proxy对象
  • 蓝桥杯省赛2021 括号序列 python

    给定一个括号序列 要求尽可能少地添加若干括号使得括号序列变得合法 当添加完成后 会产生不同的添加结果 请问有多少种本质不同的添加结果 两个结果是本质不同的是指存在某个位置一个结果是左括号 而另一个是右括号 例如 对于括号序列 只需要添加两个