UVa 1626 Brackets sequence (动态规划)
题意:用最少的括号将给定的字符串匹配,输出最优解。可能有空行。
思路:dp。
dp[i][j]表示将区间i,j之间的字符串匹配需要的最少括号数,那么
如果区间左边是(或[,表示可以和右边的字符串匹配,枚举中间断点k,如果str[i]==str[k]则dp[i][j]=min(dp[i][j],dp[i+1][k-1]+dp[k+1][j])表示不需要加入新的括号,也可以插入新的括号则dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]+1)。
如果区间最左边字符是)或],那么它不可能和右边字符串匹配,状态转移为dp[i][j]=min(dp[i][j],dp[i+1][j]+1)
每次转移的时候记录一下转移路径,最后dfs输出即可。
注意可能有空串,所以要用gets。但是在题中每行读入之间有空行,所以要多用一个gets来吃掉这个空行,否则会出错。
建议交UVa,数据比较强。POJ和ZOJ数据较弱,我最初的代码在POJ和ZOJ都过了,UVa却一直TLE。
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<iostream> #define INF 10000000 #define LL long long using namespace std; ][]; ][]; ][]; ][]; ]; int dp(int L,int R) { ; if(vis[L][R]) return f[L][R]; vis[L][R]=true; f[L][R]=INF; if(str[L]=='('||str[L]=='[') { for(int i=L; i<=R; ++i) { if((str[L]=='('&&str[i]==')')||(str[L]=='['&&str[i]==']')) { ,i-),sy=dp(i+,R); if(f[L][R]>sx+sy) { f[L][R]=sx+sy; flag[L][R]=-; pos[L][R]=i; } } ,i),dy=dp(i+,R); ) { f[L][R]=dx+dy+; flag[L][R]=; pos[L][R]=i; } } } else { ,R); ) { f[L][R]=sx+; flag[L][R]=; pos[L][R]=L; } } return f[L][R]; } void output(int L,int R) { if(L<=R) { int p=pos[L][R]; ) { putchar(str[L]); output(L+,p-); putchar(str[p]); output(p+,R); } else { if(str[L]==')'||str[L]==']') { if(str[L]==')') putchar('('); else putchar('['); putchar(str[L]); output(L+,R); } else { putchar(str[L]); output(L+,p); if(str[L]=='(') putchar(')'); else putchar(']'); output(p+,R); } } } } int main() { int T; scanf("%d",&T); getchar(); while(T--) { gets(str); gets(str); memset(vis,,sizeof(vis)); int L=strlen(str); dp(,L-); output(,L-); putchar('\n'); if(T) putchar('\n'); } ; }
UVa 1626 Brackets sequence (动态规划)的更多相关文章
- UVa 1626 - Brackets sequence(区间DP)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVA 1626 Brackets sequence(括号匹配 + 区间DP)
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105116#problem/E 题意:添加最少的括号,让每个括号都能匹配并输出 分析:dp ...
- UVA 1626 Brackets sequence 区间DP
题意:给定一个括号序列,将它变成匹配的括号序列,可能多种答案任意输出一组即可.注意:输入可能是空串. 思路:D[i][j]表示区间[i, j]至少需要匹配的括号数,转移方程D[i][j] = min( ...
- UVA - 1626 Brackets sequence (区间dp)
题意:给定一个串,可能空串,或由'[',']','(',')'组成.问使其平衡所需添加最少的字符数,并打印平衡后的串. 分析:dp[i][j]表示区间(i,j)最少需添加的字符数. 1.递推. #in ...
- 1626 - Brackets sequence——[动态规划]
Let us define a regular brackets sequence in the following way: Empty sequence is a regular sequence ...
- UVA 2451 Brackets sequence
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=9 ...
- 括号序列问题 uva 1626 poj 1141【区间dp】
首先考虑下面的问题:Code[VS] 3657 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合 ...
- POJ 题目1141 Brackets Sequence(区间DP记录路径)
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 27793 Accepted: 788 ...
- POJ 1141 Brackets Sequence
Brackets Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 29502 Accepted: 840 ...
随机推荐
- lucene5.5 field
lucene常见Field IntField 主要对int类型的字段进行存储,需要注意的是如果需要对InfField进行排序使用SortField.Type.INT来比较,如果进范围查询或过滤,需要采 ...
- 获取token,绑定微信号,自定义菜单,事件响应demo
摘要: 这个demo包含了获取token,绑定微信号,设置自定义菜单,响应文本和事件 这个教程的基础篇和提升篇都看完了,总感觉有点隔靴挠痒的感觉,讲的东西我都懂,没有吸收多少新鲜的知识.貌似还没有我这 ...
- asp.net 加载xml到menu
XML File <?xml version="1.0" encoding="utf-8" ?> <Area iAreaID ="0 ...
- javscript 中的术语和俚语
语言中俚语和方言.在JavaScript中也有一些俚语或者说是术语,看似奇淫巧技,还是有一些用处,有三种语言组件可以来构造术语:强转.逻辑运算符和位变换. 1.强转:在javascript和大部分的语 ...
- int与string之间的类型转换--示例
package demo; public class IntDemo { public static void main(String[] args) { // String-->int 类型转 ...
- C#位运算讲解与示例2
在C#中可以对整型运算对象按位进行逻辑运算.按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个位的逻辑运算结果是结果值的每个位.C#支持的位逻辑运算符如表2.9所示. 运算符号 意 ...
- 单据状态BE构建
这节主要罗列出单据状态BE构建步骤1.创建单据状态BE实体项目,修改命名空间 2.如下图所示,分别设置实体枚举状态值 3.修改单据基本属性 构造后,至此单据状态BE构建完毕
- Android Studio 简单设置
转自:http://ask.android-studio.org/?/article/14 界面设置 默认的 Android Studio 为灰色界面,可以选择使用炫酷的黑色界面.Settings - ...
- Point ZM 转换为Point 类型
打开ArcToolbox,使用ConvertionTools-> To Shapefile->FeatureClass to Shapefile 工具,注意在环境设置里,里将output ...
- iOS - Mac Vim 编辑器
Mac Vim 编辑器 1)vi 文本编辑器 1.打开一个文件:vi 文件名 按住 shift 连按两次 z 键( :q )退出 vi 编辑器 2.vi 两种模式:第一是命令模式(按 esc 进入命令 ...