[51nod1791] 合法括号子段 DP
题解:
首先我们需要发现一个性质,在括号序列不变的情况下,括号匹配是不会变的,因此不论子串怎么取,括号匹配的关系是不会变化的。这是一个很容易发现的性质,然而我太弱,没发现。
于是可以据此进行DP,我们记录下每个右括号与哪个左括号进行匹配,记为pos[i], 设f[i]表示DP到i位,子串以i结尾的方案数。
则对于一个i,如果它有pos[i],那么从pos[i] ~ i是一个合法的序列,那么这个的方案给答案贡献1。同时这段合法序列还可以和以pos[i] - 1结尾的合法子串进行两两搭配,所以转移方程为
$f[i] = f[pos[i] - 1] + 1;$
#include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 1101000
#define LL long long int n;LL ans;
int s[AC], top;
int pos[AC], f[AC];
char ss[AC]; inline void read()
{
int c = getchar();
while(c != ')' && c != '(') c = getchar();
while(c == ')' || c == '(') ss[++n] = c, c = getchar();
} void pre()
{
n = ans = top = ;
read();
for(R i = ; i <= n; i ++)
{
f[i] = pos[i] = ;
if(ss[s[top]] == '(' && ss[i] == ')') pos[i] = s[top --];
else s[++top] = i;
}
} void write(LL x)
{
if(!x) {puts(""); return ;}
top = ;
while(x) ss[++top] = x % + '', x /= ;
for(R i = top; i; i --) putchar(ss[i]);
puts("");
} void get()
{
for(R i = ; i <= n; i ++)
{
if(!pos[i]) continue;
f[i] += f[pos[i] - ] + ;
ans += f[i];
}
write(ans);
//printf("%lld\n", ans);
} void work()
{
int T;
scanf("%d", &T);
while(T --) pre(), get();
} int main()
{
// freopen("in.in", "r", stdin);
work();
// fclose(stdin);
return ;
}
[51nod1791] 合法括号子段 DP的更多相关文章
- 51 Nod 1791 合法括号子段【分治+字符串】
1791 合法括号子段 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 有一个括号序列,现在要计算一下它有多少非空子段是合法括号序列. 合法括号序列的定义是: 1. ...
- 【51nod 1791】 合法括号子段
有一个括号序列,现在要计算一下它有多少非空子段是合法括号序列. 合法括号序列的定义是: 1.空序列是合法括号序列. 2.如果S是合法括号序列,那么(S)是合法括号序列. 3.如果A和B都是合法括号序列 ...
- 51nod 1791 合法括号子段
有一个括号序列,现在要计算一下它有多少非空子段是合法括号序列. 合法括号序列的定义是: 1.空序列是合法括号序列. 2.如果S是合法括号序列,那么(S)是合法括号序列.3.如果A和B都是合法括号序列, ...
- 九度OJ 1342:寻找最长合法括号序列II (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:898 解决:366 题目描述: 假如给你一个由'('和')'组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给 ...
- 九度OJ 1337:寻找最长合法括号序列 (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:839 解决:179 题目描述: 给你一个长度为N的,由'('和')'组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的 ...
- Neko and Aki's Prank CodeForces - 1152D (括号序列,dp)
大意: 将所有长度为2*n的合法括号序列建成一颗trie树, 求trie树上选出一个最大不相交的边集, 输出边集大小. 最大边集数一定不超过奇数层结点数. 这个上界可以通过从底层贪心达到, 所以就转化 ...
- [leetcode]32. Longest Valid Parentheses最长合法括号子串
Given a string containing just the characters '(' and ')', find the length of the longest valid (wel ...
- 【LeetCode】Valid Parentheses合法括号
给定一个仅包含 '('.')'.'{'.'}'.'['.']'的字符串,确定输入的字符串是否合法. e.g. "()"."()[]{}"."[()]( ...
- 九度oj题目1342:寻找最长合法括号序列II
题目1342:寻找最长合法括号序列II(25分) 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:886 解决:361 题目描述: 假如给你一个由’(‘和’)’组成的一个随机的括号序列,当然 ...
随机推荐
- 【BGP的基本配置】
BGP的基本配置 一:根据项目需求搭建好拓扑图如下 二:配置 1:首先进行理论分析:RT1和RT2,3分别属于不同的AS;在RT1和RT2之间建立EBGP关系,在确保RT3可以学到RT1的8.1.1. ...
- webpack3构建全面提速优化vue-cli
前言 伴随着vue的全球化,各种vue的组件框架越来越完善,从早期的element-ui到vux,iview等越来越多高质量的项目,使用vue进行前端构建已然是一件工程化,模块化,敏捷化的事情 在这其 ...
- php post提交xml文件
<?php header("Content-type: text/xml;"); // xml code demo $xmlData = '<?xml version= ...
- Yii 2.0.6 - 从入口到Action执行
defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_ENV') or define('YII_ENV', 'dev'); r ...
- JavaScript 对引擎、运行时、调用堆栈的概述理解
JavaScript 对引擎.运行时.调用堆栈的概述理解 随着JavaScript越来越流行,越来越多的团队广泛的把JavaScript应用到前端.后台.hybrid 应用.嵌入式等等领域. 这篇文 ...
- POJ1236_A - Network of Schools _强连通分量::Tarjan算法
Time Limit: 1000MS Memory Limit: 10000K Description A number of schools are connected to a compute ...
- MongoDB入门---简介
最近呢,刚好有一些时间,所以就学习了一下新的数据库类型MongoDB.要想了解这个MongoDB,我们首先需要了解一个概念,那就是nosql(not only sql).一下就是官方的概念: NoSQ ...
- RAID(冗余硬盘阵列)
一. RAID定义 RAID( Redundant Array of Independent Disk 独立冗余磁盘阵列 )技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的 ...
- Android StateListDrawable的坑
有问题的代码: StateListDrawable background = new StateListDrawable(); CircleDrawable pressedDrawable = new ...
- nginx error_page
1. error_page语法 语法: error_page code [ code... ] [ = | =answer-code ] uri | @named_location 默认值: no 使 ...