题目链接1

题目链接2

题目大意

给出一个括号序列,添加最少的括号使序列正确

解题思路

先将问题简单化,从求序列退化为求最小添加括号数的问题

用区间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 解题报告的更多相关文章

  1. USACO Section2.1 Sorting a Three-Valued Sequence 解题报告

    sort3解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...

  2. timus 1175. Strange Sequence 解题报告

    1.题目描述: 1175. Strange Sequence Time limit: 1.0 secondMemory limit: 2 MB You have been asked to disco ...

  3. Ducci Sequence解题报告

    A Ducci sequence is a sequence of n-tuples of integers. Given an n-tuple of integers (a1, a2, ... ,  ...

  4. 【LeetCode】842. Split Array into Fibonacci Sequence 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  5. 【LeetCode】60. Permutation Sequence 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  6. LeetCode: Permutation Sequence 解题报告

    Permutation Sequence https://oj.leetcode.com/problems/permutation-sequence/ The set [1,2,3,…,n] cont ...

  7. USACO Section 2.1 Sorting a Three-Valued Sequence 解题报告

    题目 题目描述 给N个整数,每个整数只能是1,2,或3.现在需要对这个整数序列进行从小到大排序,问最少需要进行几次交换.N(1 <= N <= 1000) 样例输入 9 2 2 1 3 3 ...

  8. LeetCode: Longest Consecutive Sequence 解题报告

    Longest Consecutive Sequence Given an unsorted array of integers, find the length of the longest con ...

  9. BZOJ 1367 [Baltic2004]sequence 解题报告

    BZOJ 1367 [Baltic2004]sequence Description 给定一个序列\(t_1,t_2,\dots,t_N\),求一个递增序列\(z_1<z_2<\dots& ...

随机推荐

  1. vc中播放mp3文件的方法小结

    一般播放MP3常见的有两种方法,一种是自己解码,另外一种用系统的库,比如MCI,当然如果可以用控件直接用个控件会更方便. 1.      使用mci #include <windows.h> ...

  2. OpenAL播放pcm或wav数据流-windows/ios/android(一)

    OpenAL播放pcm或wav数据流-windows/iOS/Android(一)   最近在研究渲染问题,本文采用openal做pcm和wav数据流播放,并非本地文件,demo是windows的,i ...

  3. oracle 12c 列式存储 ( In Memory 理论)

    随着Oracle 12c推出了in memory组件,使得Oracle数据库具有了双模式数据存放方式,从而能够实现对混合类型应用的支持:传统的以行形式保存的数据满足OLTP应用:列形式保存的数据满足以 ...

  4. Javascript:必须知道的Javascript知识点之“单线程事件驱动”

    heiboard: Javascript:必须知道的Javascript知识点之“单线程事件驱动”

  5. CF 360 E Levko and Game —— 贪心+最短路

    题目:http://codeforces.com/contest/360/problem/E 首先,每条边不是选 \( l[i] \) 就是选 \( r[i] \): 做法就是先把边权都设成 \( r ...

  6. webpy+nginx+uwsgi安装配置

    转:(1)安装Nginx1.1 下载nginx-1.0.5.tar.gz并解压1.2 ./configure (也可以增加--prefix= path指定安装路径)此时有可能会提示缺少pcre支持,如 ...

  7. poj 1273 Drainage Ditches(最大流,E-K算法)

    一.Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clove ...

  8. source in sight 删除工程

    用十六进制编辑器打开  "我的文档/Source Insight/Projects/PROJECTS.DB3" 文件 ,找到你要删除的项目路径及名称字符串,用0替换相关位置的数据.

  9. Qt webview调用JavaScript 带参函数

    void MainWindow::on_pushButtonShowMarker_clicked() { QString lat = "104.701681"; QString l ...

  10. new/delete 和malloc/free 的区别

    new/delete 和malloc/free 的区别 一.基本概念malloc/free:1.函数原型及说明:      void *malloc(long NumBytes):该函数分配了NumB ...