codeforces629C Famil Door and Brackets (dp)
题意:给你一个长度为n的括号匹配串(不一定恰好匹配),让你在这个串的前面加p串和后面加上q串,使得这个括号串平衡(平衡的含义是对于任意位置的括号前缀和大于等于0,且最后的前缀和为0)。
思路:枚举这个字符串前面p字符串的长度,我们可以使得p字符串的前缀和大于等于字符串s的最小前缀和minx,那么p+s就符合前缀和大于等于0,然后q的方案数也能确定了。我们用dp[i][j]表示i个括号平衡度为j的方案数,那么可以先预处理出来dp的值。然后我们算出s字符串的最小前缀和minx,最后我们只要枚举p的长度i和平衡度j,那么sum+=dp[i][j]*dp[n-m-i][per_s+j],(per_s是整个s字符串的平衡度,per_s+j为q的平衡度).
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cstdio> 6 #include<set> 7 #include<map> 8 #include<vector> 9 #include<cstring> 10 #include<stack> 11 #include<cmath> 12 #include<queue> 13 #define clc(a,b) memset(a,b,sizeof(a)) 14 #include <bits/stdc++.h> 15 using namespace std; 16 #define LL long long 17 const int maxn= 100050; 18 const int inf=0x3f3f3f3f; 19 char s[maxn]; 20 const int mod=1000000007; 21 LL dp[2050][2050]; 22 23 int main() 24 { 25 int n,m; 26 scanf("%d%d",&n,&m); 27 scanf("%s",s+1); 28 clc(dp,0); 29 dp[0][0]=1; 30 for(int i=1; i<=n-m; i++) 31 { 32 for(int j=0; j<=i; j++) 33 { 34 if(j>0) 35 dp[i][j]=(dp[i][j]+dp[i-1][j-1])%mod; 36 dp[i][j]=(dp[i][j]+dp[i-1][j+1])%mod; 37 } 38 } 39 int minx=inf; 40 int per_s=0; 41 for(int i=1; i<=m; i++) 42 { 43 if(s[i]=='(') 44 per_s++; 45 else 46 per_s--; 47 minx=min(minx,per_s); 48 } 49 LL sum=0; 50 for(int i=0; i<=n-m; i++) 51 for(int j=0; j<=i; j++) 52 { 53 if(j+minx>=0&&j+per_s<=n-m-i) 54 sum=(sum+dp[i][j]*dp[n-m-i][j+per_s])%mod; 55 } 56 cout<<sum<<endl; 57 return 0; 58 }
View Code
转载于:https://www.cnblogs.com/ITUPC/p/5208636.html
codeforces629C Famil Door and Brackets (dp)相关推荐
- 【CF 149D】Coloring Brackets(dp)
[CF 149D]Coloring Brackets(dp) D. Coloring Brackets time limit per test 2 seconds memory limit per t ...
- 求三角形最大面积(DP)
求三角形最大面积(DP) 在OJ上奇迹般WA了:WA:70. Why? #include <iostream> #include <string.h> using namesp ...
- LeetCode 编辑距离 II(DP)
1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...
- LeetCode 1220. 统计元音字母序列的数目(DP)
文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: - 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i ...
- LeetCode 265. 粉刷房子 II(DP)
文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同. 当然,因为市场上不同颜色油 ...
- LeetCode 256. 粉刷房子(DP)
文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成红色.蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其与相邻的两个房子颜色不能相同. 当然,因 ...
- LeetCode 1223. 掷骰子模拟(DP)
1. 题目 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始 ...
- LeetCode 1155. 掷骰子的N种方法(DP)
1. 题目 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你 ...
- LeetCode 1139. 最大的以 1 为边界的正方形(DP)
1. 题目 给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量.如果不存在,则返回 0. 示例 1: 输入:grid ...
- 程序员面试金典 - 面试题 17.23. 最大黑方阵(DP)
1. 题目 给定一个方阵,其中每个单元(像素)非黑即白. 设计一个算法,找出 4 条边皆为黑色像素的最大子方阵. 返回一个数组 [r, c, size] ,其中 r, c 分别代表子方阵左上角的行号和 ...
最新文章
- 阿里机器学习算法面经(已offer)
- Java项目打包部署war文件
- java 1kb_[代码全屏查看]-java输入输出流及文件操作
- vue的父子组建之间的通信(-),基于props和$emit之间的传递
- java 接口 签名机制_java – 当接口A在其方法签名中定义接口B时
- Python常用第三方库大盘点
- PRML-系列一之1.5.5~1.5.6
- Deep Learning for 3D Recognition
- 使用GDAL构造OpenCV的图像格式
- html点击发送qq邮箱_qq邮箱怎么发送文件夹
- C语言 16进制转float
- koa2 mysql sequelize_[转]使用nodejs-koa2-mysql-sequelize-jwt 实现项目api接口
- 使用晨曦记账本,分析某个时间段每个账户收支结余
- coap 返回版本信息_CoAP协议学习笔记
- 02尚硅谷书城案例-用户的注册
- 本地代码上传到gitlab
- 通过数据分析,了解外国人眼里的真实李子柒
- IT业界新闻资讯网站推荐
- 【华为交换机配置命令大全】
- 初二生态系统思维导图_初中七、八年级生物思维导图大全21张.pdf
热门文章
- OSError: [WinError 126] 找不到指定的模块。【专治疑难杂症】
- java 9消失_java9增强的自动关闭资源
- 米线店结账程序 装饰着模式_真实数据:外卖销售9999+ 长沙米线万单店 它究竟是怎么做到的?...
- Mysql 全局锁入门
- SparkStreaming transform算子入门案例
- HTTP协议请求中返回的各个状态码对应的状态信息
- JavaScript 是如何工作的:WebRTC和对等网络的机制!
- 【Java并发编程】—–“J.U.C”:ArrayBlockingQueue
- 专家:苹果有能力打造Mac芯片但不会去做
- android:layout_height、android:layout_width、android:height、android:width的关系与区别