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 ...
随机推荐
- Yii2框架查询指定字段和获取添加数据的id
指定字段: $historyinfo = Healthy::find()->select(['healthy_id','pet_name','hardware_name','hardware_c ...
- 红字差评系列1.第K小数
[题目分析] 二分答案?smg,我太弱了 //不开longlong wa到挺了 #include <cstdio> #include <cstring> #include &l ...
- oracle组查询
概念: 所谓组查询即将数据按照某列或者某些列相同的值进行分组,然后对该组的数据进行组函数运用,针对每一组返回一个结果. note: 1.组函数可以出现的位置: select子句和having 子句 2 ...
- CUBRID学习笔记 48查询优化
cubrid的中sql查询语法 查询优化 c#,net,cubrid,教程,学习,笔记欢迎转载 ,转载时请保留作者信息.本文版权归本人所有,如有任何问题,请与我联系wang2650@sohu.com ...
- iOS- iPhone App 如何运营?
在质量过硬的情况下,如何运营才能使APP冲上app store的推荐?如何获得公众认可?获得下载量? 睡前简单分享一下最近从书中.互联网中浏览到的一些信息,和自己的一点理解. 首先这个问题很大.就抛砖 ...
- 03-第一个C语言程序的分析
本文目录 一.代码分析 二.开发和运行C程序的步骤 三.总结 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语 ...
- idea 工程添加svn关联
1.想启用idea的SVN插件还需要在idea配置一下(Ctrl + Alt + S),如下图所示: 2.接下来启用idea的版本控制插件(这里当然是启用Subversion了),打开“VCS”菜单项 ...
- dataserver test code
main.go package main import ( "database/sql" "fmt" "log" "net/htt ...
- C#高级进阶--重写函数
这里要说一下,重写是继承时发生,在子类中重新定义父类中的方法.例如:基类方法声明为virtual方法,派生类中使用override声明此方法的重写. 基类中的访问修饰符在子类中是不能被修改的.比如说基 ...
- Struts2 报 Result 错误
写的时候犯了个低级错误 struts.xml中 配置result 的时候 没有配置type