UVALive-8078 Bracket Sequence 简单dp
题目链接:https://cn.vjudge.net/problem/UVALive-8078
题意
括号序列T是这样定义的:
- T是个空的
- T是(T), {T}, 或者 [T]
- T是两个T组成的,比如()()就是一个T
现在给一个n个字符长的串,问以每个字符为左端点的最长括号序列是多长。
思路
显然对i这个地方可以讨论一下:
如果i是个右括号,答案是0。
如果i是个左括号:
如果以i+1为起点的最长串后边的字符与左括号匹配,答案是加上这个字符后边的最长串。
如果不匹配,答案是0。
细节上注意不要越界即可,边界是dp[strlen]=0
提交过程
AC |
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=2e5;
char str[maxn];
int sign[300], ans[maxn];
int main(void){
int T, kase=0;
sign['(']=1;
sign['{']=2;
sign['[']=3;
sign['<']=4;
sign[')']=-1;
sign['}']=-2;
sign[']']=-3;
sign['>']=-4;
scanf("%d", &T);
while (T--){
scanf("%s", str);
memset(ans, 0, sizeof(ans));
int len=strlen(str);
for (int i=len; i>=0; i--){
int elem=sign[str[i]];
if (elem<0) ans[i]=0;
else{
if (i+1<len && sign[str[i+1]]==elem*-1) ans[i]=2+ans[i+2];
else if (i+1<len){
int nxt=sign[str[ans[i+1]+i+1]];
// printf("%d %d --\n", nxt, elem);
if (nxt==elem*-1) ans[i]=ans[i+1]+2+ans[i+ans[i+1]+2];
else ans[i]=0;
}else if (i+1>=len) ans[i]=0;
}
}
printf("Case %d:\n", ++kase);
for (int i=0; i<len; i++)
printf("%d\n", ans[i]);
}
return 0;
}
Time | Memory | Length | Lang | Submitted |
---|---|---|---|---|
49ms | None | 1116 | C++ 5.3.0 | 2018-08-24 11:28:32 |
UVALive-8078 Bracket Sequence 简单dp的更多相关文章
- Codeforces Beta Round #5 C. Longest Regular Bracket Sequence 栈/dp
C. Longest Regular Bracket Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.c ...
- (CodeForces - 5C)Longest Regular Bracket Sequence(dp+栈)(最长连续括号模板)
(CodeForces - 5C)Longest Regular Bracket Sequence time limit per test:2 seconds memory limit per tes ...
- UVaLive 3530 Martian Mining (简单DP)
题意:给定一个n*m的网格,每个格子里有A矿和B矿数量,A必须由右向左运,B只能从下向上运,中间不能间断,问最大总数量. 析:一个简单DP,dp[i][j] 表示 从 (0, 0) 到 (i, j) ...
- 【Codeforces】CF 5 C Longest Regular Bracket Sequence(dp)
题目 传送门:QWQ 分析 洛谷题解里有一位大佬讲的很好. 就是先用栈预处理出可以匹配的左右括号在数组中设为1 其他为0 最后求一下最长连续1的数量. 代码 #include <bits/std ...
- DP UVALive 6506 Padovan Sequence
题目传送门 /* 题意:两行数字,相邻列一上一下,或者隔一列两行都可以,从左到右选择数字使和最大 DP:状态转移方程:dp[i][j] = max (dp[i][j], dp[1-i][j-1] + ...
- CodeForces - 224C. Bracket Sequence (栈模拟)简单做法
A bracket sequence is a string, containing only characters "(", ")", "[&quo ...
- Educational Codeforces Round 4 C. Replace To Make Regular Bracket Sequence 栈
C. Replace To Make Regular Bracket Sequence 题目连接: http://www.codeforces.com/contest/612/problem/C De ...
- Codeforces Round #302 (Div. 2) C. Writing Code 简单dp
C. Writing Code Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/544/prob ...
- 找规律 UVALive 6506 Padovan Sequence
题目传送门 /* 找规律:看看前10项就能看出规律,打个表就行了.被lld坑了一次:( */ #include <cstdio> #include <algorithm> #i ...
随机推荐
- maven项目发布后访问jsp页面报错
type Exception report message java.lang.NullPointerException description The server encountered an i ...
- 《代码敲不队》第八次团队作业:Alpha冲刺 第四天
项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 代码敲不队 作业学习目标 掌握软件编码实现的工程要求. 团队项目github仓库地址链接 GitH ...
- 2015 Multi-University Training Contest 8 hdu 5383 Yu-Gi-Oh!
Yu-Gi-Oh! Time Limit: 2000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ID: ...
- [using_microsoft_infopath_2010]Chapter12 管理监视InfoPath表单服务
本章概要: 1.在SharePoint中心控制台管理InfoPath设置 2.分析监视浏览器表单开考虑潜在性能问题 3.最小化回发数据
- Unity3D中C#和JS的方法互相調用
因为Unity3D中一些腳本的方法仅仅能用在JS中.在C#中是無效的,而C#能够與服務器端通訊,JS本身卻不行.所以勢必會遇到這兩種語言腳本中方法的互相調用,下面是演示样例. 兩個文件 test1.j ...
- SVN打tag
SVN打tag是一个非经常常使用的功能,要谈打tag,还得从SVN官方推荐的文件夹结构说起.SVN官方推荐在一个版本号库的根文件夹下先建立trunk.branches.tags这三个文件夹 ...
- tapestry3创建自己定义组件
两种方法创建自己定义标签: 一.通过AbstractComponent父类渲染,此种方法直接在java类中编写页面脚本.然后输出. 1.编写java类com/ailk/ech/ecop/view/te ...
- java基础——transient
今天在看struts1源代码的时候,发如今ActionForm中首先声明了两个transient类型的protected变量. 之前没有接触过该transient类型,所以就查了查. transien ...
- VIM7.4 编译安装 开启python
https://github.com/wklken/k-vim ./configure --prefix=/usr/local/vim74 \--with-features=huge \--enabl ...
- asf
这些日子我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公开,希望能 够为国内IT的发展尽自己一份微薄的力量.最近看到很多学生朋友和我当年一样没有方向 ,所以把我的经历写出来与大家共勉, ...