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 ...
随机推荐
- popUpWindow 动画无法超出窗体的解决方案
popupWindow 做动画时,当要求有一个放大动画时,动画无法超出窗体,给人的感觉是只有内容在放大,窗体不动. 这是由于窗口大小固定的原因,解决方案是加大popUpwindow的 大小. 一个比较 ...
- android权限使用
1.拍照权限使用:
- [问题2014S02] 复旦高等代数II(13级)每周一题(第二教学周)
问题2014S02 设实系数多项式 \begin{eqnarray*}f(x) &=& a_nx^n+a_{n-1}x^{n-1}+\cdots+a_1x+a_0, \\ g(x) ...
- Oracle的多表查询
多表查询概念: 所谓多表查询,又称表联合查询,即一条语句涉及到的表有多张,数据通过特定的连接进行联合显示. 基本语法: select column_name,.... from table1,tabl ...
- (淘宝无限适配)手机端rem布局详解(转载非原创)
从网易与淘宝的font-size思考前端设计稿与工作流 本文结合自己对网易与淘宝移动端首页html元素上的font-size这个属性的思考与学习,讨论html5设计稿尺寸以及前端与设计之间协作流程的问 ...
- Ubuntu anzhuang
zhongwenshurubuzhidaozenmeqiehuan anhzuang Flash apt-get install flashplugin-installer
- 学习mongo系列(六)limit(munber),skip(number)
> db.user.find().pretty(){ "_id" : ObjectId("56946fba3a18f4867aecbcd1"), &quo ...
- js之oop <五>对象序列化(js的JSON操作)
js对象序列化的过程,就是对象转换为JSON的过程.JSON.stringify() 将对象序列化成JSON.(接收对象,输出字符串) var obj = {x:2,y:3}; var str = J ...
- Android Fragment是什么
Fragment是Activity中用户界面的一个行为或者一个部分.你可以在一个单独的Activity上把多个Fragment组合成一个多区域的UI,并且可以在多个Activity中使用.你可以认为F ...
- 关于 RxJava 技术介绍
Awesome-RxJava RxJava resources Blog 给 Android 开发者的 RxJava 详解 -强烈推荐 扔物线的文章 讲解非常详细 NotRxJava懒人专用指南 -这 ...