[NYIST15]括号匹配(二)(区间dp)

题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=15

经典区间dp,首先枚举区间的大小和该区间的左边界,这时右边界也可计算出来。首先初始化一个匹配,那就是看看这两个括号是否匹配,即:

(s[i] == ‘(‘ && s[j] == ‘)‘) || (s[i] == ‘[‘ && s[j] == ‘]‘) ? dp(i,j) = dp(i+1,j-1)+2) : dp(i,j) = 0

接下来枚举i和j中间的所有点,更新dp(i,j)=max(dp(i,j), dp(i+m)+dp(m+1,j))寻找可能更优的匹配。

 1 /*
 2 ━━━━━┒ギリギリ♂ eye!
 3 ┓┏┓┏┓┃キリキリ♂ mind!
 4 ┛┗┛┗┛┃\○/
 5 ┓┏┓┏┓┃ /
 6 ┛┗┛┗┛┃ノ)
 7 ┓┏┓┏┓┃
 8 ┛┗┛┗┛┃
 9 ┓┏┓┏┓┃
10 ┛┗┛┗┛┃
11 ┓┏┓┏┓┃
12 ┛┗┛┗┛┃
13 ┓┏┓┏┓┃
14 ┃┃┃┃┃┃
15 ┻┻┻┻┻┻
16 */
17 #include <algorithm>
18 #include <iostream>
19 #include <iomanip>
20 #include <cstring>
21 #include <climits>
22 #include <complex>
23 #include <cassert>
24 #include <cstdio>
25 #include <bitset>
26 #include <vector>
27 #include <deque>
28 #include <queue>
29 #include <stack>
30 #include <ctime>
31 #include <set>
32 #include <map>
33 #include <cmath>
34 using namespace std;
35 #define fr first
36 #define sc second
37 #define cl clear
38 #define BUG puts("here!!!")
39 #define W(a) while(a--)
40 #define pb(a) push_back(a)
41 #define Rint(a) scanf("%d", &a)
42 #define Rll(a) scanf("%I64d", &a)
43 #define Rs(a) scanf("%s", a)
44 #define Cin(a) cin >> a
45 #define FRead() freopen("in", "r", stdin)
46 #define FWrite() freopen("out", "w", stdout)
47 #define Rep(i, len) for(int i = 0; i < (len); i++)
48 #define For(i, a, len) for(int i = (a); i < (len); i++)
49 #define Cls(a) memset((a), 0, sizeof(a))
50 #define Clr(a, x) memset((a), (x), sizeof(a))
51 #define Full(a) memset((a), 0x7f7f7f, sizeof(a))
52 #define lrt rt << 1
53 #define rrt rt << 1 | 1
54 #define pi 3.14159265359
55 #define RT return
56 #define lowbit(x) x & (-x)
57 #define onenum(x) __builtin_popcount(x)
58 typedef long long LL;
59 typedef long double LD;
60 typedef unsigned long long ULL;
61 typedef pair<int, int> pii;
62 typedef pair<string, int> psi;
63 typedef pair<LL, LL> pll;
64 typedef map<string, int> msi;
65 typedef vector<int> vi;
66 typedef vector<LL> vl;
67 typedef vector<vl> vvl;
68 typedef vector<bool> vb;
69
70 const int maxn = 1100;
71 int dp[maxn][maxn];
72 char s[maxn];
73 int n;
74
75 int main() {
76     // FRead();
77     int T;
78     Rint(T);
79     W(T) {
80         Rs(s); n = strlen(s);
81         Cls(dp);
82         For(k, 2, n+1) {
83             Rep(i, n-k+1) {
84                 dp[i][i+k-1] = 0;
85                 int j = i + k - 1;
86                 if((s[i] == ‘(‘ && s[j] == ‘)‘) || (s[i] == ‘[‘ && s[j] == ‘]‘)) {
87                     dp[i][j] = dp[i+1][j-1] + 2;
88                 }
89                 For(m, i, j) {
90                     dp[i][j] = max(dp[i][j], dp[i][m] + dp[m+1][j]);
91                 }
92             }
93         }
94         printf("%d\n", n - dp[0][n-1]);
95     }
96     RT 0;
97 }
时间: 2024-10-14 02:08:31

[NYIST15]括号匹配(二)(区间dp)的相关文章

括号匹配问题 区间DP经典问题

题目链接 http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=15 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 分析:要求要添加多少个,可以求出最大匹配的长度,这样剩下的都是没有匹配的,所以每个对于一个匹配就可以了. 即 答案 =

poj2955:括号匹配,区间dp

题目大意: 给一个由,(,),[,]组成的字符串,其中(),[]可以匹配,求最大匹配数 题解:区间dp: dp[i][j]表示区间 [i,j]中的最大匹配数 初始状态 dp[i][i+1]=(i,i+1可以匹配)?2:0 状态转移见代码 代码: #include <iostream> #include <stdio.h> #include<string.h> #include<algorithm> #include<string> #includ

NYOJ15-括号匹配(二)-区间DP

http://acm.nyist.net/JudgeOnline/problem.php? pid=15 dp[i][j]表示从i到j至少须要加入多少个括号才干满足匹配条件. 初始化: if(i == j) dp[i][j] = 1; else dp[i][j] = INF; 状态转移: 当i < j时; if(match(str[i], str[j])) dp[i][j] = min(dp[i][j], d[i + 1][j - 1]); 然后切割区间, 找最优切割点k. (i <= k &

「kuangbin带你飞」专题二十二 区间DP

layout: post title: 「kuangbin带你飞」专题二十二 区间DP author: "luowentaoaa" catalog: true tags: - kuangbin - 区间DP - 动态规划 传送门 B.LightOJ - 1422 Halloween Costumes 题意 按顺序参加舞会,参加一个舞会要穿一种衣服,可以在参加完一个舞会后套上另一个衣服再去参加舞会,也可以在参加一个舞会的时候把外面的衣服脱了,脱到合适的衣服,但是脱掉的衣服不能再穿,参加完

imooc数据结构探险-栈篇 栈应用括号匹配二 由群友启发改良james_yuan老师算法

如图所示 引用群友内容 //老师代码有点麻烦了,不用声明两个mystack的,直接判断是否是左括号, //是的话就在mystack中push另一半括号:如果是右括号且又不是需要的括号, //就直接打印不匹配,如果是需要的右括号,就pop掉左括号.最后看mystack中栈顶是否为0,为0则打印括号匹配 /* 老师最后一点其实错了,default 其实没有必要写,只要把pNeedStack->pop(currentNeed)改为 if(!pNeedStack->pop(currentNeed))

NYOJ 15 括号匹配(二) dp

题目连接:check here~ 题意是说给一个字符串,包含'(',')','[',']'四种字符,判断至少需要添加几个字符使所给字符串括号匹配. 区间型动态规划,设dp[i][j]表示在字符串s中i位置到j位置所需要添加的最少的字符(i <= j) 有两种情况: 1.dp[i][j] = dp[i+1][j] + 1; 表示:在i到j之间没有与s[i]相匹配的括号,则必须添加一个字符来与之匹配,问题就转化为:从i+1位置到j位置所需要添加的最少的字符+1. 2.dp[i][j] = min{

NYOJ 括号匹配系列2,5

本文出自:http://blog.csdn.net/svitter 括号匹配一:http://acm.nyist.net/JudgeOnline/problem.php?pid=2 括号匹配二:http://acm.nyist.net/JudgeOnline/problem.php?pid=15 之前被这个题目难住,现在看动态规划就顺便过来AC了它.结果发现当年被难住一点也不丢人.. 括号匹配一很简单,就是栈的应用,AC代码: //================================

POJ 2955-Brackets(区间DP)

Brackets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3340   Accepted: 1716 Description We give the following inductive definition of a "regular brackets" sequence: the empty sequence is a regular brackets sequence, if s is a reg

集训第五周动态规划 J题 括号匹配

Description We give the following inductive definition of a “regular brackets” sequence: the empty sequence is a regular brackets sequence, if s is a regular brackets sequence, then (s) and [s] are regular brackets sequences, and if a and b are regul