【牛客 - 188D 】愤怒(01滚动数组优化dp,括号匹配方案个数,tricks)
题干:
小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)相关推荐
- C 简单瞎搞题(牛客练习赛22)(bitset优化dp)
Bitset优化Dp 题目链接 一般DP做法 显然后面的数是与前面的数字相关的,所以我们有dp数组,dp[i][j]dp[i][j]dp[i][j]选取了jjj个数,iii是否可以被创造出来,如果可以 ...
- 信息学奥赛一本通1267:【例9.11】01背包问题(二维dp与滚动数组优化)
[题目描述] 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,. ...
- 01背包问题(当有的背包重量是非整数时)的递归(优化成动态规划+再用滚动数组优化)解法+一些动态规划(递归,搜索)的高级技巧
当背包重量是整数时,动态规划可以用数组存储状态就可以了. 当背包重量是非整数时,用map存储状态就可以了!主要思路: map(构造函数中参数comp是仿函数(或者叫函数对象))+递归优化(" ...
- dp笔记:关于DP算法和滚动数组优化的思考
从网上总结了一些dp的套路以及对滚动数组的一些思考,现记录如下,希望以后回顾此类算法时会有所帮助. 目录 1.DP算法经验 1.DP算法核心: 2.DP算法类别以及例题 例1:三步问题 例2:最小路径 ...
- 【NOIP2015提高组】子串 区间DP+滚动数组优化
题意: 有两个仅包含小写英文字母的字符串 A 和 B. 现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一个新的字符串. 请问 ...
- 牛客-139 I. Substring(后缀数组 or 后缀自动机)
牛客-139 I. Substring(后缀数组 or 后缀自动机) 题目链接 题意 一个由{a,b,c}\{a, b, c\}{a,b,c}组成的字符串SSS,求S子串的最大的集合,使得集合里的字符 ...
- 牛客题霸 [将升序数组转化为平衡二叉搜索树]C++题解/答案
牛客题霸 [将升序数组转化为平衡二叉搜索树]C++题解/答案 题目描述 给出一个升序排序的数组,将其转化为平衡二叉搜索树(BST). 题解: 二叉搜索树的定义: 二叉搜索树或者是一棵空树,或者是具有下 ...
- 牛客题霸 [ 未排序数组中累加和为给定值的最长子数组长度] C++题解/答案
牛客题霸 [ 未排序数组中累加和为给定值的最长子数组长度] C++题解/答案 题目描述 给定一个无序数组arr, 其中元素可正.可负.可0.给定一个整数k,求arr所有子数组中累加和为k的最长子数组长 ...
- 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段,然后根据 ...
最新文章
- 程序员的十大谎言,你中了几个? | 每日趣闻
- php开发ftp服务器搭建教程,在Linux中搭建一个FTP服务器
- SQL Server XML性能优化(Best Practices)
- 火了!16岁高中生做的 Python 3.9 八大新特性图
- python采用那种编程模式_使用Mixin设计模式进行Python编程的方法讲解
- Linux学习笔记-动态库的生成
- 动手学习数据分析(二)——数据处理
- ubuntu执行configure配置代码出现unable to guess system type报错
- c#里listview里如何获取点击的是哪一列
- 当要写验证性的代码时,利用git进行代码管理
- IAST 技术进阶系列(二):全场景多核驱动
- 知网导出外文参考文献格式和下载文章(2019.5)
- 淘宝/京东/苏宁/拼多多/唯品会 返利消息批量转链思路
- HTML_多媒体效果_embed标签详解
- android开发便签实验报告,什么是艾宾浩斯遗忘曲线?利用这一记忆规律可以提升孩子记忆力...
- 使用useSelector、useDispatch替代connect
- 联想sr550服务器虚拟机,联想(Lenovo)SR550
- web课程设计网页规划与设计:HTML+CSS美妆设计题材——雅诗兰黛(5页)
- AutoLISP将图形中文字写入外部文件
- 偶然 --徐志摩
热门文章
- 在.net 2.0 中执行分布式事务:隐式事务篇(SQL Server 与 Oracle)
- 第六课 从词向量到NLP分类问题
- [Leetcode][第75题][JAVA][颜色分类][双(三)指针][计数排序]
- [小技巧] ArrayList与LinkedList对比与常见方法
- [剑指offer]面试题第[50]题[JAVA][第一个只出现一次的字符][哈希表][HashMap]
- [Leedcode][JAVA][第355题][设计推特][面向对象][哈希表][链表][优先队列]
- excel亮灯怎么设置_Excel表格技巧—怎么给表格设置密码
- Maven项目的基本创建步骤
- 180C. Letter
- java netbeans 教程_NetBeans 教程