UVa 1626 括号序列(矩阵连乘)
https://vjudge.net/problem/UVA-1626
题意:
输入一个由 "(" 、 ")" 、 "[" 、 "]" 构成的序列,添加尽量少的括号,得到一个规则序列。
思路:
d[i][j]表示 i~j 需要添加的最少个数,具体看代码吧,我也只是看着刘汝佳的代码写的 。
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std; char s[];
int n;
int d[][]; bool cmp(char a, char b)
{
return a == '('&& b == ')' || (a == '['&& b == ']');
} void dp()
{ for (int i = ; i < n; i++)
{
d[i + ][i] = ; //初始化,对应于下面的d[i+1][j-1]
//也就是如果为()或[],此时不需要添加括号
d[i][i] = ; //这个对应于单个'('、')'、'['、']'的情况
} //从短区间开始枚举
for (int i = n - ; i >= ; i--)
{
for (int j = i + ; j < n; j++)
{
d[i][j] = n;
//如果为()or[],则这最外面的不用管
if (cmp(s[i], s[j])) d[i][j] = min(d[i][j], d[i + ][j - ]);
for (int k = i; k < j; k++)
d[i][j] = min(d[i][j], d[i][k] + d[k + ][j]);
}
}
} void print(int i, int j)
{
if (i>j) return;
if (i == j)
{
if (s[i] == '(' || s[i] == ')') cout << "()";
else cout << "[]";
return;
}
int ans = d[i][j];
//如果和里面所要加的括号数一样,那么 i 和 j 是不需要加括号的
if (cmp(s[i], s[j]) && ans == d[i + ][j - ])
{
cout << s[i];
print(i + , j - );
cout << s[j];
return;
} for (int k = i; k < j; k++)
{
if (ans == d[i][k] + d[k + ][j])
{
print(i, k);
print(k + , j);
return;
}
}
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
int T;
cin >> T;
getchar();
while (T--)
{
gets(s);
gets(s);
n = strlen(s);
dp();
print(, n - );
cout << endl;
if (T) cout << endl;
}
return ;
}
UVa 1626 括号序列(矩阵连乘)的更多相关文章
- 括号序列问题 uva 1626 poj 1141【区间dp】
首先考虑下面的问题:Code[VS] 3657 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合 ...
- BZOJ4350: 括号序列再战猪猪侠
Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列 ...
- BZOJ4350: 括号序列再战猪猪侠【区间DP】
Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列, ...
- UVa 1626 - Brackets sequence(区间DP)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- DP专题——括号序列
毕竟是个渣,写完一遍之后又按LRJ的写了一遍,再写了一遍递归版,最终加上输出解部分 括号序列 定义如下规则序列(字符串): 空序列是规则序列: 如果S是规则序列,那么(S)和[S]也是规则序列: 如果 ...
- 【BZOJ】2209: [Jsoi2011]括号序列(splay)
http://www.lydsy.com/JudgeOnline/problem.php?id=2209 splay又犯逗........upd1那里的sum忘记赋值反............. 本题 ...
- UVa 1626 (输出方案) Brackets sequence
正规括号序列定义为: 空序列是正规括号序列 如果S是正规括号序列,那么[S]和(S)也是正规括号序列 如果A和B都是正规括号序列,则AB也是正规括号序列 输入一个括号序列,添加尽量少的括号使之成为正规 ...
- 51nod1476 括号序列的最小代价
这题应该可以用费用流写吧?不过我想不出贪心来TAT.其实还是单调队列乱搞啊T_T //ÍøÉϵÄ̰ÐÄËã·¨ºÃÉñ°¡¡£¡£¡£ÎÒÖ»»áÓÃ×îС·ÑÓÃ×î´óÁ÷ÅÜTAT #in ...
- lintcode: 有效的括号序列
题目: 有效的括号序列 给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and']', 判定是否是有效的括号序列. 样例 括号必须依照 "() ...
随机推荐
- Linux Packages Search
网站 : https://www.pkgs.org/ https://centos.pkgs.org/
- react-native run-android error: unknown host service
D:\rnworkspace\Hello>react-native run-android JS server already running.Running D:\Android\sdk/pl ...
- R实现的最小二乘lsfit函数学习
1.源码 function (x, y, wt = NULL, intercept = TRUE, tolerance = 1e-, yname = NULL) { x <- as.matrix ...
- 171. Excel Sheet Column Number(简单数学题)
Given a column title as appear in an Excel sheet, return its corresponding column number. For exampl ...
- Python tricks(3) -- list和dict的遍历和方法
每个人在使用python的过程中都会遍历list和dict. List遍历 最常用最简单的遍历list的方法 a = ["a", "b", "c&qu ...
- python 类的私有方法例子
#coding=utf-8 class Person(object): id=12 def __init__(self,name): self.name=name ...
- git常用命令3
一. Git 常用命令速查 git branch 查看本地所有分支git status 查看当前状态git commit 提交git branch -a 查看所有的分支git branch -r 查看 ...
- web前端----JavaScript的DOM(一)
一.什么是HTML DOM HTML Document Object Model(文档对象模型) HTML DOM 定义了访问和操作HTML文档的标准方法 HTML DOM 把 HTML 文档呈现 ...
- JavaScript 中语法规范及调试
JavaScript 中语法规范及调试 版权声明:未经博主授权,内容严禁分享转载 JavaScript 开发环境 JavaScript 脚本可以使用任意一款纯文本编辑器进行编程开发. 常见的前端开发编 ...
- git和github的简单配合使用
1.安装git,TortoiseGit. 2.用帐号A登陆github,建立一个版本仓库test1.用默认值创建就可以了. 3.在本机用TortoiseGit克隆仓库test1.直接选https开头的 ...