括号匹配(二)(动态规划)

括号匹配(二)

时间限制:1000 ms  |  内存限制:65535 KB

难度:6

描述
给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。
如:
[]是匹配的
([])[]是匹配的
((]是不匹配的
([)]是不匹配的
输入
第一行输入一个正整数N,表示测试数据组数(N<=10)
每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超过100
输出
对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组测试输出占一行
样例输入
4
[]
([])[]
((]
([)]
样例输出
0
0
3
2

题解:类似与区间dp;

代码:

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 string str;
 5 int dp[111][111];
 6 int main(){
 7     int N;
 8     cin>>N;
 9     while(N--){
10             str.clear();
11         cin>>str;
12         for(int i=0;i<str.size();i++)dp[i][i]=1;//又是多了个等号,无语==
13         for(int i=1;i<str.size();i++){
14             for(int j=i-1;j>=0;j--){
15                     dp[j][i]=dp[j][i-1]+1;
16                 for(int k=j;k<i;k++){
17                     if(str[k]-str[i]==-1||str[k]-str[i]==-2)
18                         dp[j][i]=min(dp[j][i],dp[j][k-1]+dp[k+1][i-1]);
19                         //cout<<dp[j][i]<<"    ";
20                 }
21             }
22         }
23         cout<<dp[0][str.size()-1]<<endl;
24     }
25 return 0;}

刚开始用栈写的,没考虑清楚,果断错了;

代码:例如【))】

 1 #include<stdio.h>
 2 #include<stack>
 3 #include<map>
 4 using namespace std;
 5 char s[110];
 6 int main(){
 7     int N,tot;
 8     scanf("%d",&N);
 9     while(N--){map<char,int>mp;
10             stack<char>sign;
11             tot=0;
12             mp[‘(‘]=1;mp[‘)‘]=-1;
13             mp[‘[‘]=2;mp[‘]‘]=-2;
14         scanf("%s",s);
15         for(int i=0;s[i];i++){
16             if(mp[s[i]]>0)sign.push(s[i]);
17             else{
18                 if(!sign.empty()){
19                     if(mp[sign.top()]+mp[s[i]]==0)sign.pop();
20                     else tot++;
21                 }
22                 else tot++;
23             }
24         }
25         while(!sign.empty()){
26             sign.pop();
27             tot++;
28         }
29         printf("%d\n",tot);
30     }
31 return 0;}

时间: 2024-07-28 16:48:34

括号匹配(二)(动态规划)的相关文章

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

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

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代码: //================================

动态规划(2)--括号匹配(二)

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不超

括号匹配(二) -- 经典动态规划

这里的括号匹配 , 如果两个相同的话   就执行下面的  语句 if(cmp(str[i],str[j])) dp[i][j] = min(dp[i][j],dp[i+1][j-1]); 每次确定  从 i 到 j 的需要填补的 括号的时候  就默认  这个 值是  105 1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include&l

NYOJ - 括号匹配(二)(经典dp)

括号匹配(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:6 描写叙述 给你一个字符串,里面仅仅包括"(",")","[","]"四种符号,请问你须要至少加入多少个括号才干使这些括号匹配起来. 如: []是匹配的 ([])[]是匹配的 ((]是不匹配的 ([)]是不匹配的 输入 第一行输入一个正整数N,表示測试数据组数(N<=10) 每组測试数据都仅仅有一行,是一个字符串S,S中仅仅包括以上所说的四

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{

NYOJ15 括号匹配(二)

经典的动态规划题 这道题感觉确实有一定难度,感觉自己的dp学的弱爆了!以后还要努力啊! 括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<

括号匹配(二)

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不

nyoj 15 括号匹配(二)

括号匹配(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:6 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来.如:[]是匹配的([])[]是匹配的((]是不匹配的([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10)每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符,S的长度不