3295: 括号序列 -(序列DP)

描述

  给定一串字符串,只由 “[”、“]” 、“(”、“)”四个字符构成。现在让你尽量少的添加括号,得到一个规则的序列。

  例如:“()”、“[]”、“(())”、“([])”、“()[]”、“()[()]”,都是规则的序列。这几个不是规则的,如:“(”、“[”、“]”、“)(”、“([()”。

输入

  输入有多组测试数据。输入一串字符串序列,长度不大于255。

输出

   输出最少添加的括号数目。

样例输入

()
(
([()
[[(([]

样例输出

0
1
2
4

题目来源

椒江校区第一届C语言编程大赛

这个题是问需要添加多少个括号使之成为合    法括号序列,那么我们可以先求有多少合法    的括号匹配,然后用字符串长度减去匹配的    括号数就行

    状态转移方程主要是对于我们枚举的区间     dp[i][j],如果i和j处的括号能够匹配,则    dp[i][j]=dp[i+1][j-1]+1;

    因为我们是从小到大枚举长度,所以小长    度    的区间一定是最优的,所以当 i 与 j 匹配    时,则是子区间的最优值+1

 1 /*
 2
 3 */
 4 #include<iostream>
 5 #include<cstring>
 6 #include<cstdio>
 7 #include<cmath>
 8 using namespace std;
 9 string s;
10 int f[500][500];
11 int main() {
12     while(cin>>s){
13         memset(f,0,sizeof f);
14         int n=s.size();
15         for(int w=1;w<=n;w++) f[w][w]=1;
16         for(int l=2;l<=n;l++)
17           for(int i=1;i<=n-l+1;++i)
18             {
19                 int j=l+i-1;
20                 f[i][j]=2147483647;
21                 if((s[i-1]==‘(‘&&s[j-1]==‘)‘)||(s[i-1]==‘[‘&&s[j-1]==‘]‘))f[i][j]=f[i+1][j-1];
22                 for(int k=i;k<=j-1;k++)
23                     f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
24             }
25         printf("%d\n",f[1][n]);
26     }
27     return 0;
28 }

夜多漫长

时间: 2024-12-14 09:57:51

3295: 括号序列 -(序列DP)的相关文章

codevs 1962 马棚问题--序列型DP

1962 马棚问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 每天,小明和他的马外出,然后他们一边跑一边玩耍.当他们结束的时候,必须带所有的马返回马棚,小明有K个马棚.他把他的马排成一排然后跟随它走向马棚,因为他们非常疲劳,小明不想让他的马做过多的移动.因此他想了一个办法:将马按照顺序放在马棚中,后面的马放的马棚的序号不会大于前面的马放的马棚的序号.而且,他不想他的K个马棚中任何一个空置,也不想任何一匹马在外面.已知共有黑

TOJ 3295 括号序列(区间DP)

描述 给定一串字符串,只由 "["."]" ."(".")"四个字符构成.现在让你尽量少的添加括号,得到一个规则的序列. 例如:"()"."[]"."(())"."([])"."()[]"."()[()]",都是规则的序列.这几个不是规则的,如:"("."[".&quo

BZOJ 1046: [HAOI2007]上升序列 LIS -dp

1046: [HAOI2007]上升序列 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3438  Solved: 1171[Submit][Status][Discuss] Description 对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm)且( ax1 < ax2 < … < axm).那么就称P为S的一个上升序列.如果有多

【BZOJ-3675】序列分割 DP + 斜率优化

3675: [Apio2014]序列分割 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1420  Solved: 583[Submit][Status][Discuss] Description 小H最近迷上了一个分隔序列的游戏.在这个游戏里,小H需要将一个长度为n的非负整数序列分割成k+1个非空的子序列.为了得到k+1个子序列,小H需要重复k次以下的步骤: 1.小H首先选择一个长度超过1的序列(一开始小H只有一个长度为n的序列——也就是一开始

【BZOJ4818】[Sdoi2017]序列计数 DP+矩阵乘法

[BZOJ4818][Sdoi2017]序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ,这n个数中,至少有一个数是质数.Alice想知道,有多少个序列满足她的要求. Input 一行三个数,n,m,p. 1<=n<=10^9,1<=m<=2×10^7,1<=p<=100 Output 一行一个数,满足Alice的要求的序列数量,答案对20170408取模. Sampl

序列型DP:⑨要写信

题目描述 Description 琪露诺(冰之妖精)有操控冷气的能力.能瞬间冻结小东西,比普通的妖精更危险.一直在释放冷气的她周围总是非常寒冷. 由于以下三点原因…… 琪露诺的符卡 冰符“Icicle Fall”-Easy的弹幕有够蠢的,只要站在她的正前方就没任何弹幕会碰到你: ZUN在<红魔乡>中介绍她时已经说她有点笨笨的了: 在ZUN放出<东方花映冢>的介绍图时,在图中把琪露诺放在了⑨的位置上,并以“⑨笨蛋”简单带过,从此“⑨”及“笨蛋”就成为她的别名了…… 所以琪露诺便得到了

题目2 : 回文字符序列(区间DP)

时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串aba中,回文子序列为"a", "a", "aa", "b", "aba",共5个.内容相同位置不同的子序列算不同的子序列. 输入 第一行一个整数T,表示数据组数.之后是T组数据,每组数据为一行字符串. 输出 对于每组数据输出一行,格式为"

SDUT 2403-单峰序列(DP)

单峰序列 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 明明最近遇到一个数学问题:给定n个数字(A1,A2,A3......An),每个数字均是小于2^31的正整数,现需要知道这n个数字中的最长单峰子序列长度是多少.所谓单峰序列是指满足如下条件之一的子序列: (1)Ak1<Ak2<Ak3<......<Akm (k1,k2,k3....km均在1到n之间) (2)Ak1>Ak2>Ak3>...

1134 最长上升子序列 (序列型 DP)

思路: 由于一般的动态规划时间复杂度是O(n^2)(哈哈哈哈 第一次用的就是这个!)用在这里由于n最大为50000 所以会超时 到这里我们可以用一个数组来动态维护这个最长上升的子序列,将你要输入的子序列一个一个按升序存入数组 如果发现当前要存入的数字x比数组最后一个还要大 那么直接存入数组,否则就将数组中按升序第一个大于x的数 用x替换掉(这里的替换我们可以用二分搜索来进行) 由于二分搜索的时间复杂度是log(n) 所以总的时间复杂度为O(n log(n) ): 下面举个例子 例如 -6 4 -