题干:

小w很生气

小w有一个长为n的括号序列
愤怒小w想把这个括号序列分为两个括号序列
小w想让分为的这两个括号序列同时合法
小w想知道一共有多少种划分方案

(划分的意思是划分为两个子序列)

注意两个序列是 A,B 和 两个序列是B,A 算两种方案,也就是同一位置位于不同划分为方案不同

输入描述:

第一行一正整数n
第二行,一串长为n的括号序列

输出描述:

一个正整数
表示对方案数对2333取mod后的方案数

示例1

输入

复制

4
(())

输出

复制

6

示例2

输入

复制

8
()()()()

输出

复制

16

备注:

n ≤ 10000

解题报告:

就是求括号匹配个数。dp[i][j]表示,长度为i的表达式,左括号比右括号多j个的情况数。那么ans=dp[len][0]。注意第二层循环要遍历到sum[i]!!不能直接跑到10000,这样也就意味着,比如可以从非法的dp[i][500],加上500个),从而更新到了f[j][0]?

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#include<cctype>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
char s[MAX];
int dp[10005][10005];//dp[i][j]代表前i个序列中,左括号比有括号多j个 的方案数。
const int mod = 2333;
int sum[10009];
int main() {int n;cin>>n;scanf("%s",s+1);int len = strlen(s+1);dp[0][0]=1;for(int j = 1; j<=n; j++) {if(s[j]=='(')sum[j]=sum[j-1]+1;else sum[j]=sum[j-1]-1;}for(int i = 1; i<=len; i++)  {for(int j = 0; j<=sum[i]; j++) {//不选dp[i][j] = dp[i-1][j];//选if(s[i] == '(' && j>0) dp[i][j] += dp[i-1][j-1];if(s[i] == ')') dp[i][j] += dp[i-1][j+1];dp[i][j]%=mod;}}printf("%d\n",dp[len][0]);return 0 ;
}

滚动数组优化:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#include<cctype>
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
const int MAX = 2e5 + 5;
char s[MAX];
int dp[2][10005];//dp[i][j]代表前i个序列中,左括号比有括号多j个 的方案数。
int qq[100000000];
const int mod = 2333;
int sum[10009];
int main() {int n;cin>>n;scanf("%s",s+1);int len = strlen(s+1);dp[0][0]=1;for(int j = 1; j<=n; j++) {if(s[j]=='(')sum[j]=sum[j-1]+1;else sum[j]=sum[j-1]-1;}int flag = 0;for(int i = 1; i<=len; i++)  {flag ^= 1;for(int j = 0; j<=sum[i]; j++) {//不选dp[flag][j] = dp[flag^1][j];//选if(s[i] == '(' && j>0) dp[flag][j] += dp[flag^1][j-1];if(s[i] == ')') dp[flag][j] += dp[flag^1][j+1];dp[flag][j]%=mod;}memset(dp[flag^1],0,sizeof dp[flag^1]);}printf("%d\n",dp[flag][0]);return 0 ;
}

注意别忘每次循环完了之后都memset一下!

【牛客 - 188D 】愤怒(01滚动数组优化dp,括号匹配方案个数,tricks)相关推荐

  1. C 简单瞎搞题(牛客练习赛22)(bitset优化dp)

    Bitset优化Dp 题目链接 一般DP做法 显然后面的数是与前面的数字相关的,所以我们有dp数组,dp[i][j]dp[i][j]dp[i][j]选取了jjj个数,iii是否可以被创造出来,如果可以 ...

  2. 信息学奥赛一本通1267:【例9.11】01背包问题(二维dp与滚动数组优化)

    [题目描述] 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,. ...

  3. 01背包问题(当有的背包重量是非整数时)的递归(优化成动态规划+再用滚动数组优化)解法+一些动态规划(递归,搜索)的高级技巧

    当背包重量是整数时,动态规划可以用数组存储状态就可以了. 当背包重量是非整数时,用map存储状态就可以了!主要思路:  map(构造函数中参数comp是仿函数(或者叫函数对象))+递归优化(" ...

  4. dp笔记:关于DP算法和滚动数组优化的思考

    从网上总结了一些dp的套路以及对滚动数组的一些思考,现记录如下,希望以后回顾此类算法时会有所帮助. 目录 1.DP算法经验 1.DP算法核心: 2.DP算法类别以及例题 例1:三步问题 例2:最小路径 ...

  5. 【NOIP2015提高组】子串 区间DP+滚动数组优化

    题意: 有两个仅包含小写英文字母的字符串 A 和 B. 现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一个新的字符串. 请问 ...

  6. 牛客-139 I. Substring(后缀数组 or 后缀自动机)

    牛客-139 I. Substring(后缀数组 or 后缀自动机) 题目链接 题意 一个由{a,b,c}\{a, b, c\}{a,b,c}组成的字符串SSS,求S子串的最大的集合,使得集合里的字符 ...

  7. 牛客题霸 [将升序数组转化为平衡二叉搜索树]C++题解/答案

    牛客题霸 [将升序数组转化为平衡二叉搜索树]C++题解/答案 题目描述 给出一个升序排序的数组,将其转化为平衡二叉搜索树(BST). 题解: 二叉搜索树的定义: 二叉搜索树或者是一棵空树,或者是具有下 ...

  8. 牛客题霸 [ 未排序数组中累加和为给定值的最长子数组长度] C++题解/答案

    牛客题霸 [ 未排序数组中累加和为给定值的最长子数组长度] C++题解/答案 题目描述 给定一个无序数组arr, 其中元素可正.可负.可0.给定一个整数k,求arr所有子数组中累加和为k的最长子数组长 ...

  9. HDU - 1024 Max Sum Plus Plus 最大m段子段和+滚动数组优化

    给定n个数字,求其中m段的最大值(段与段之间不用连续,但是一段中要连续) 例如:2 5 1 -2 2 3 -1五个数字中选2个,选择1和2 3这两段. dp[i][j]从前j个数字中选择i段,然后根据 ...

最新文章

  1. 程序员的十大谎言,你中了几个? | 每日趣闻
  2. php开发ftp服务器搭建教程,在Linux中搭建一个FTP服务器
  3. SQL Server XML性能优化(Best Practices)
  4. 火了!16岁高中生做的 Python 3.9 八大新特性图
  5. python采用那种编程模式_使用Mixin设计模式进行Python编程的方法讲解
  6. Linux学习笔记-动态库的生成
  7. 动手学习数据分析(二)——数据处理
  8. ubuntu执行configure配置代码出现unable to guess system type报错
  9. c#里listview里如何获取点击的是哪一列
  10. 当要写验证性的代码时,利用git进行代码管理
  11. IAST 技术进阶系列(二):全场景多核驱动
  12. 知网导出外文参考文献格式和下载文章(2019.5)
  13. 淘宝/京东/苏宁/拼多多/唯品会 返利消息批量转链思路
  14. HTML_多媒体效果_embed标签详解
  15. android开发便签实验报告,什么是艾宾浩斯遗忘曲线?利用这一记忆规律可以提升孩子记忆力...
  16. 使用useSelector、useDispatch替代connect
  17. 联想sr550服务器虚拟机,联想(Lenovo)SR550
  18. web课程设计网页规划与设计:HTML+CSS美妆设计题材——雅诗兰黛(5页)
  19. AutoLISP将图形中文字写入外部文件
  20. 偶然 --徐志摩

热门文章

  1. 在.net 2.0 中执行分布式事务:隐式事务篇(SQL Server 与 Oracle)
  2. 第六课 从词向量到NLP分类问题
  3. [Leetcode][第75题][JAVA][颜色分类][双(三)指针][计数排序]
  4. [小技巧] ArrayList与LinkedList对比与常见方法
  5. [剑指offer]面试题第[50]题[JAVA][第一个只出现一次的字符][哈希表][HashMap]
  6. [Leedcode][JAVA][第355题][设计推特][面向对象][哈希表][链表][优先队列]
  7. excel亮灯怎么设置_Excel表格技巧—怎么给表格设置密码
  8. Maven项目的基本创建步骤
  9. 180C. Letter
  10. java netbeans 教程_NetBeans 教程