题意:给定一个括号序列,将它变成匹配的括号序列,可能多种答案任意输出一组即可。注意:输入可能是空串。

思路:D[i][j]表示区间[i, j]至少需要匹配的括号数,转移方程D[i][j] = min(D[i][k] + D[k+1][j], D[i][j]).

    输入时,可能是空串应该用gets、fgets、getline,应注意换行符的吸收。每组数据前有一个换行符,输出的两组数据之间有换行。

AC代码:

#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#include<utility>
#include<string>
#include<iostream>
using namespace std;
#define eps 1e-10
#define inf 0x3f3f3f3f
#define  PI pair<int, int>
const int maxn = 100 + 5;
char s[maxn];
int d[maxn][maxn];

bool match(char a, char b) {
	if(a == '(' && b == ')' || a == '[' && b == ']') return true;
	return false;
}

void print(int i, int j) {
	if(i > j) return;
	if(i == j) {
		if(s[i] == '(' || s[i] == ')') printf("()");
		else printf("[]");
	}
	int ans = d[i][j];
	if(match(s[i], s[j]) && d[i+1][j-1] == ans) {
		printf("%c", s[i]);
		print(i+1, j-1);
		printf("%c", s[j]);
		return;
	}
	for(int k = i; k < j; ++k) {
		if(d[i][k] + d[k+1][j] == ans) {
			print(i, k);
			print(k+1, j);
			return;
		}
	}
}

void solve(int n) {
	//初始化边界
	for(int i = 0; i < n; ++i) {
		d[i + 1][i] = 0;
		d[i][i] = 1;
	}
	for(int i = n - 2; i >= 0; --i)
		for(int j = i + 1; j < n; ++j) {
			d[i][j] = n;  //最多需要匹配N个括号
			if(match(s[i], s[j])) d[i][j] = min(d[i][j], d[i+1][j-1]);
			for(int k = i; k < j; ++k) {
				d[i][j] = min(d[i][k] + d[k+1][j], d[i][j]);
			}
	}
	print(0, n - 1);
}

int main() {
	int T;
	scanf("%d", &T);
	getchar();
	int kase = 0;
	while(T--){
		if(kase++) {
			printf("\n");
		}
		getchar();
		fgets(s, sizeof(s), stdin);
		int n = strlen(s);
		if(n == 1) {
			printf("\n");
			continue; //空串
		}
		solve(n - 1);
		printf("\n");
	}
	return 0;
}

如有不当之处欢迎指出!

UVA 1626 Brackets sequence 区间DP的更多相关文章

  1. POJ 1141 Brackets Sequence(区间DP, DP打印路径)

    Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...

  2. poj 1141 Brackets Sequence 区间dp,分块记录

    Brackets Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 35049   Accepted: 101 ...

  3. UVa 1626 - Brackets sequence(区间DP)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. UVA - 1626 Brackets sequence (区间dp)

    题意:给定一个串,可能空串,或由'[',']','(',')'组成.问使其平衡所需添加最少的字符数,并打印平衡后的串. 分析:dp[i][j]表示区间(i,j)最少需添加的字符数. 1.递推. #in ...

  5. UVA 1626 Brackets sequence(括号匹配 + 区间DP)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105116#problem/E 题意:添加最少的括号,让每个括号都能匹配并输出 分析:dp ...

  6. UVa 1626 Brackets sequence (动态规划)

    题意:用最少的括号将给定的字符串匹配,输出最优解.可能有空行. 思路:dp. dp[i][j]表示将区间i,j之间的字符串匹配需要的最少括号数,那么 如果区间左边是(或[,表示可以和右边的字符串匹配, ...

  7. poj 1141 Brackets Sequence (区间dp)

    题目链接:http://poj.org/problem?id=1141 题解:求已知子串最短的括号完备的全序列 代码: #include<iostream> #include<cst ...

  8. Ural 1183 Brackets Sequence(区间DP+记忆化搜索)

    题目地址:Ural 1183 最终把这题给A了.. .拖拉了好长时间,.. 自己想还是想不出来,正好紫书上有这题. d[i][j]为输入序列从下标i到下标j最少须要加多少括号才干成为合法序列.0< ...

  9. poj 1141 Brackets Sequence ( 区间dp+输出方案 )

    http://blog.csdn.net/cc_again/article/details/10169643 http://blog.csdn.net/lijiecsu/article/details ...

随机推荐

  1. Log4j扩展使用--输出地Appender

    OK,现在我们来研究输出低Appended. Appender控制日志输出的位置 Log4j日志系统允许把日志输出到不同的地方,如控制台(Console).文件(Files).根据天数或者文件大小产生 ...

  2. springMVC中使用POI方式导出excel至客户端、服务器实例

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 这里的方法支持导出excel至项目所在服务器,或导 ...

  3. Calendar使用方法

    Calendar类的静态方法getInstance()可以初始化一个日历对象: Calendar now = Calendar.getInstance(); 可以使用下面三个方法把日历定到任何一个时间 ...

  4. JS获取滚动条距离顶部高度

    一.jQuery获取的相关方法 jquery 获取滚动条高度 获取浏览器显示区域的高度 : $(window).height(); 获取浏览器显示区域的宽度 : $(window).width(); ...

  5. Docker几个基本常识

    标签(linux): docker 此文来自本人学习以及网络整理而来. 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 对于用户来说,可能一开始在不了解的情况下会 ...

  6. iOS-cocoapods安装与使用以及常见错误

    前言 CocoaPods是一个负责管理iOS项目中第三方开源代码的工具. 二.安装由于网上的教程基本都大同小异,但细节之处还不是很完善,所以借机会在这里补充下:注:要使用CocoaPods,那就要下载 ...

  7. 通过 ['1', '2', '3'].map(parseInt) 学习 map 和 parseInt 函数

    看到一道笔试题: ['1', '2', '3'].map(parseInt) 这道题目中涉及到 map 和 parseInt 函数的运用,如果对这两个函数的理解不充分的话,是很难思考出正确的结果的. ...

  8. maps.reg

    ^/(.*\.miaopai.com/stream/.*\.mp4\?.*) http://$1 ^/([[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{ ...

  9. Global对象

    1.Global对象是不需要创建实例就可以直接调用方法或属性的对象.有点类是于java中的工具类 2.关于汉字的网络传递 网络访问的过程中在传递数据的时候,传递的本质都是0101,如果你要传送字符的话 ...

  10. C++——带默认参数值的函数

    函数在声明时可以预先给出默认的形参值,调用时如给出实参,则采用实参值,否则采用预先给出的默认参数值. ,) { return x + y;} int main() { add(,);//10+20 a ...