POJ1141Brackets Sequence 解题报告
题目大意
给出一个括号序列,添加最少的括号使序列正确
解题思路
先将问题简单化,从求序列退化为求最小添加括号数的问题
用区间dp n³解决
f[l][r]表示使第l个到r个区间正确的最小添加数
1 :当l = r时, f[l][r] = f[l+1][r-1]
2 : 在l到j中,枚举中间点k,则f[l][r] = min (f[l][r], f[l][k] + f[k+1][r])
求出了最小添加括号数后,再来思考完整的问题
用递归解决输出方案
假设有一个 从 l 到 r 的区间
这个区间的最优解有两种情况:
1:有上述第1种情况求得
2:由上述第2种情况求得
对于 1, 先输出最左边的字符,再递归中间部分,再输出最右边的字符
对于2, 用w数组记录此时最优方案的分割点k,分别递归左半边和右半边
特别情况,当l = r 则需在这个地方添加一个括号与其配对
注意
要对读入序列长度为0进行特判
不然会很惨

几个小时也调不出来qwq
完整代码加注释
(突然发现我的代码好短)
#include <bits/stdc++.h>
using namespace std;
char ch[105];
int f[105][105], w[105][105];
void out (int x) {
if (ch[x] == '(' or ch[x] == ')') cout << "()";
else cout << "[]";
}//输出与单个括号配对的函数
void print (int l, int r) {
if (l > r) return;
else if (l == r) out (l); //若l = r 则需在这个地方添加一个括号与其配对
else if (w[l][r] == 0) cout << ch[l], print (l + 1, r - 1), cout << ch[r]; //上述情况1
else print (l, w[l][r]), print (w[l][r] + 1, r); //上述情况2
} //输出方案递归函数
int main(){
scanf ("%s", ch + 1);
int len = strlen (ch + 1);
if (!len) puts(""); //当长度为0的特判
memset (f, 0x3f, sizeof (f));
for (int i = 1; i <= 101; i++) f[i][i] = 1; //长度为1的区间初值赋值为1
for (int l = 2; l <= len; l++) //区间dp
for (int i = 1; i <= len - l + 1; i++) {
int j = i + l - 1;
if ((ch[i] == '[' and ch[j] == ']') or (ch[i] == '(' and ch[j] == ')'))
if (l != 2) f[i][j] = f[i+1][j-1]; else f[i][j] = 0; //当这两个可以匹配的情况,注意:当长度为2时要特判
for (int k = i; k < j; k++)
if (f[i][j] > f[i][k] + f[k+1][j]) f[i][j] = f[i][k] + f[k+1][j], w[i][j] = k; //枚举并记录下最优方案的分割点
}
print (1, len);
return 0;
}
POJ1141Brackets Sequence 解题报告的更多相关文章
- USACO Section2.1 Sorting a Three-Valued Sequence 解题报告
sort3解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- timus 1175. Strange Sequence 解题报告
1.题目描述: 1175. Strange Sequence Time limit: 1.0 secondMemory limit: 2 MB You have been asked to disco ...
- Ducci Sequence解题报告
A Ducci sequence is a sequence of n-tuples of integers. Given an n-tuple of integers (a1, a2, ... , ...
- 【LeetCode】842. Split Array into Fibonacci Sequence 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 【LeetCode】60. Permutation Sequence 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- LeetCode: Permutation Sequence 解题报告
Permutation Sequence https://oj.leetcode.com/problems/permutation-sequence/ The set [1,2,3,…,n] cont ...
- USACO Section 2.1 Sorting a Three-Valued Sequence 解题报告
题目 题目描述 给N个整数,每个整数只能是1,2,或3.现在需要对这个整数序列进行从小到大排序,问最少需要进行几次交换.N(1 <= N <= 1000) 样例输入 9 2 2 1 3 3 ...
- LeetCode: Longest Consecutive Sequence 解题报告
Longest Consecutive Sequence Given an unsorted array of integers, find the length of the longest con ...
- BZOJ 1367 [Baltic2004]sequence 解题报告
BZOJ 1367 [Baltic2004]sequence Description 给定一个序列\(t_1,t_2,\dots,t_N\),求一个递增序列\(z_1<z_2<\dots& ...
随机推荐
- codeforces 637B B. Chat Order(map,水题)
题目链接: B. Chat Order time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- C++中类型转换
static_cast 静态类型转换. 在编译的时候C++编译器会做类型检查,基本类型能转换,指针类型不进行转换. C语言中隐式类型转换的地方均可以使用static_cast. ...
- 【leetcode刷题笔记】Validate Binary Search Tree
Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...
- uoj problem 10
uoj problem 10 题目大意: 给定任务若干,每个任务在\(t_i\)收到,需要\(s_i\)秒去完成,优先级为\(p_i\) 你采用如下策略: 每一秒开始时,先收到所有在该秒出现的任务,然 ...
- MySQL on Azure高可用性设计 DRBD - Corosync - Pacemaker - CRM (二)
在上一篇文章中描述了MySQL HA on Azured 设计思路,本篇文章中将描述具体的部署,每个组件的安装和配置. 整体的设计架构如下: 下面将是所有组件的安装配置过程,所有的虚拟机是CentOS ...
- LAMP 1.2 Apache编译安装问题解决
这个错误安装 yum install -y gcc error: mod_deflate has been requested but can not be built due to prerequi ...
- 菜鸟攻城狮2(JAVA开发环境)
1.JDK下载路径:www.oracle.com/technetwork/java/javase/downloads 2.安装案例:最后一步认证操作 win+R 或者 点击开始--〉运行 输入“cmd ...
- js中Math.round、parseInt、Math.floor和Math.ceil小数取整总结(转)
js中Math.round.parseInt.Math.floor和Math.ceil小数取整总结 Math.round.parseInt.Math.floor和Math.ceil 都可以返回一个整数 ...
- UGUI解决嵌套使用多个ScrollRect时的Drag拖动冲突问题
很简单,直接看代码: using UnityEngine.UI; using UnityEngine.EventSystems; using UnityEngine; /// <summary& ...
- Maven 命令格式及一些常用命令
Maven自身指定定义了一套对项目进行编译,测试,打包,运行,部署等工作的抽象.Maven自己是不实际负责这些工作的,而是把它们交给了插件.所以Maven命令的实际工作执行者是各种各样的插件. 要了解 ...