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

思路: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. BSA Network Shell系列-runcmd/runscript命令

    runcmd和runscript ## 1 功能概述 runcmd/runscript:runcmd在一台或多台机器执行Network Shell命令(单个命令),而runscript执行的是脚本,二 ...

  2. maven系列--settings.xml

    安装maven,会有一份settings.xml文件,我们可以理解这份文件就是用来管理本地maven的一系列东西的.这里我先贴出一份完整的原始xml. <?xml version="1 ...

  3. awk练习题-v参数

    [xxxx.com]a=123bsas=sa2asd=a12ip=ip123[ooo.com]asd12=1223ip=ip123xas=123[xxoo.cn]asas=123sip=xs12213 ...

  4. CGroup Namspace

    CGroup 介绍 CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制.记录.隔离 进程组 (process groups) 所使用的物力资源 (如 cpu ...

  5. scala 小结(一)

    Scala 是什么?(What is scala?)   引用百度百科对于scala的定义: Scala是一门多范式的编程语言,一种类似java的编程语言,设计初衷是实现可伸缩的语言.并集成面向对象编 ...

  6. flask----flask-session

    一.flask-session flask-session是flask框架的session组件,由于原来flask内置session使用签名cookie保存,该组件则将支持session保存到多个地方 ...

  7. aop难点解析。

    静态织入和动态织入的区别? 需求示例:假设有一个包,一个包当中有一个方法,我们想在这个方法的前后,加上环绕. 那么怎么加呢? 把知道的都说一遍. 1.建立JsonService 2.建立JSONASP ...

  8. Go笔记-方法

    [方法的概念]     在 Go 语言中,结构体就像是类的一种简化形式,那么面向对象程序员可能会问:类的方法在哪里呢?在 Go 中有一个概念,它和方法有着同样的名字,并且大体上意思相同:Go 方法是作 ...

  9. Java对正则表达式的支持(二)

    正则表达式的主要用途: a.在目标字符串中找出匹配正则表达式的部分 b.校验目标字符串是否符合正则表达式,例如校验邮箱地址 c.在目标字符串中替换符合正则表达式的部分为其他的字符串 Scanner类是 ...

  10. 洛谷 [P2774] 方格取数问题

    二分图最大点权独立集 通过题目描述我们可以很明显的看出要通过二分图建模,二分图求最大独立点集很容易,就是建立二分图求n-最小割,然而这里加入了权值,而且权值是在点上的,那么我们对于每个点连一条到源点或 ...