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

思路: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. kindeditor使用

    下载地址http://kindeditor.net/down.php @官方文档 使用步骤: 引入js <script charset="utf-8" src="r ...

  2. Servlet--ServletContext接口

    Servlet--ServletContext接口 定义public interface ServletContext 定义了一个 Servlet 的环境对象,通过这个对象,Servlet 引擎向 S ...

  3. CSS——类和ID选择器的区别

    1.相同点,可以应用在任何元素. 2.不同点,ID选择器只能在元素里只能分别引用,不能同时引用. 如: <style type="text/css">.stress{( ...

  4. jQuery动画详解

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. jQuery 动画 jQuery提供的一组网页中常见的动画效果,这些动画 ...

  5. MySQL数据库中实现对中文字段按照首字字母排序

    转载自网络! 1. 在MySQL中,我们经常会对一个字段进行排序查询,但进行中文排序和查找的时候,对汉字的排序和查找结果往往都是错误的. 这种情况在MySQL的很多版本中都存在. 如果这个问题不解决, ...

  6. [DeeplearningAI笔记]改善深层神经网络_优化算法2.1_2.2_mini-batch梯度下降法

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.1 mini-batch gradient descent mini-batch梯度下降法 我们将训练数据组合到一个大的矩阵中 \(X=\b ...

  7. [DeeplearningAI笔记]改善深层神经网络_深度学习的实用层面1.9_归一化normalization

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.9 归一化Normaliation 训练神经网络,其中一个加速训练的方法就是归一化输入(normalize inputs). 假设我们有一个 ...

  8. 新建play项目eclipsify后导入eclipse后无法debug调试

    Error occurred during initialization of VMagent library failed to init: jdwpERROR: Cannot load this ...

  9. git stash暂存文件

    git stash 可用来暂存当前正在进行的工作, 比如想pull 最新代码,但又不想提交代码.先git stash暂存,pull之后,用git stash pop或者git stash apply取 ...

  10. HashMap实现分析

    HashMap最基本的实现思想如下图所示,使用数组加链表的组合形式来完成数据的存储. Entry在数组中的位置是由key的hashcode决定的. 向一个数组长度为16,负载因子为0.75的HashM ...