码迷,mamicode.com
首页 > 其他好文 > 详细

[tyvj1193]括号序列

时间:2016-04-03 00:06:36      阅读:300      评论:0      收藏:0      [点我收藏+]

标签:

描述

  定义如下规则序列(字符串):
1.空序列是规则序列;
2.如果S是规则序列,那么(S)和[S]也是规则序列;
3.如果A和B都是规则序列,那么AB也是规则序列。
       例如,下面的字符串都是规则序列:
(),[],(()),([]),()[],()[()]
       而以下几个则不是:
(,[,],)(,()),([()
现在,给你一些由‘(’,‘)’,‘[’,‘]’构成的序列,你要做的,是找出一个最短规则序列,使得给你的那个序列是你给出的规则序列的子列。(对于序列a1,a2,…, 和序列bl,b2,…, ,如果存在一组下标1≤i1<i2<…< ≤m,使得aj= 对一切1≤j≤n成立,那么a1,a2…, 就叫做b1,b2,…, 的子列。

输入格式

输入文件仅一行,全部由‘(’,‘)’,‘]’,‘]’组成,没有其他字符,长度不超过255。

输出格式

添加括号最少的数目

测试样例1

输入

[[(([]

输出

4

备注

ACM/ICPC 2001

分析

黑书上的原题。F(i, j)表示[i, j]符合要求添加括号最小数目。方程:

F(i, j) = 0, i>j;

F(i, j) = 1, i=j;

F(i, j) = min{ F(i+1, j-1) (ispair(i, j)), F(i+1, j) (s[i]=‘(‘||‘[‘), F(i, j-1) (s[i]=‘)‘||‘]‘), min{F(i, k) + F(k+1, j)} (i≤k≤j-1) };

代码

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 int F[256][256];
 5 string s;
 6 bool ispair(int i, int j)
 7 {
 8     return (s[i] == ( && s[j] == )) || (s[i] == [ && s[j] == ]);
 9 }
10 void mysearch(int l, int r)
11 {
12     if (F[l][r] != 200000000)
13         return;
14     else if (l > r)
15         F[l][r] = 0;
16     else if (l == r)
17         F[l][r] = 1;
18     else {
19         if (ispair(l, r)) {
20             mysearch(l + 1, r - 1);
21             if (F[l + 1][r - 1] < F[l][r])
22                 F[l][r] = F[l + 1][r - 1];
23         }
24         if (s[l] == ( || s[l] == [) {
25             mysearch(l + 1, r);
26             if (F[l + 1][r] + 1 < F[l][r])
27                 F[l][r] = F[l + 1][r] + 1;
28         }
29         if (s[l] == ) || s[l] == ]) {
30             mysearch(l, r - 1);
31             if (F[l][r - 1] + 1 < F[l][r])
32                 F[l][r] = F[l][r - 1] + 1;
33         }
34         for (int k = l; k <= r - 1; ++k) {
35             mysearch(l, k);
36             mysearch(k + 1, r);
37             if (F[l][k] + F[k + 1][r] < F[l][r])
38                 F[l][r] = F[l][k] + F[k + 1][r];
39         }
40     }
41 }
42 int main()
43 {
44     cin >> s;
45     for (int i = 0; i != 256; ++i)
46         for (int j = 0; j != 256; ++j)
47             F[i][j] = 200000000;
48     mysearch(0, s.size() - 1);
49     cout << F[0][s.size() - 1];
50     return 0;
51 }

 

[tyvj1193]括号序列

标签:

原文地址:http://www.cnblogs.com/smileandyxu/p/5348519.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!